Das Problem der statischen Klassenvariable in C# WinForms - Warum funktioniert dieser Code nicht?
-
20-09-2019 - |
Frage
Ich habe zwei verschiedene Formen in meiner WinForms -App (MainForm und Form2 Say). Beide bitten um einen Zugriff auf Mydataset, über eine statische "GetInstance" -Methode. Das Problem ist, dass nach dem MainForm eine Instanz hat, wenn Form2 eine Instanz erhalten muss. Die statische "mydataset" -Variable ist null, während ich voraussichtlich bereits festgelegt worden sein soll? Irgendwelche Ideen?
public class MyDataSet
{
public static MyDataSet myDataSet;
// This was null 2nd call to getInstance
private DataSet myData = new DataSet();
public static MyDataSet GetInstance()
{
if (myDataSet == null)
{
return new MyDataSet();
}
else
{
return myDataSet;
}
}
Es scheint also fast, dass die statische "mydataset" -Variable nicht nur einmal funktioniert?
Lösung
Sie haben vergessen, MyDataset die neu erstellte Instanz zuzuweisen
if(myDataSet == null)
{
myDataSet = new MyDataSet();
}
return myDataSet
Andere Tipps
Du hast nicht gesetzt myDataSet
Dies ist der richtige Code:
public class MyDataSet
{
public static MyDataSet myDataSet;
// This was null 2nd call to getInstance
private DataSet myData = new DataSet();
public static MyDataSet GetInstance()
{
if (myDataSet == null)
{
myDataSet =new MyDataSet();
}
return myDataSet;
}
public class MyDataSet
{
public static MyDataSet myDataSet;
// This was null 2nd call to getInstance
private DataSet myData = new DataSet();
public static MyDataSet GetInstance()
{
if (myDataSet == null)
{
myDataSet = new MyDataSet(); // Changed at this point
return myDataSet;
}
else
{
return myDataSet;
}
}
Schau dir das an Artikel Von Jon Skeet. Wie andere gesagt haben, dass Sie die Variable nicht festlegen, möchten aber auch ein robusteres Muster implementieren oder das Singleton möglicherweise loswerden. So können Sie mehrere Instanzen aus mydataset erstellen.
Ich würde mit der vierten oder fünften Version gehen, wenn Sie einen Singleton brauchen.