проблема области видимости переменной статического класса в C # winforms - почему этот бит кода не работает? - PullRequest
1 голос
/ 13 января 2010

В моем приложении WinForms есть две разные формы (скажем, MainForm и Form2). Они оба запрашивают доступ к MyDataSet через статический метод getInstance. Проблема в том, что после того, как MainForm получил экземпляр, когда Form2 необходимо получить экземпляр, статическая переменная "myDataSet" имеет значение null, тогда как я ожидаю, что она уже установлена? Есть идеи?

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;
        }
    }

Так что почти кажется, что статическая переменная "myDataSet" не работает с точки зрения наличия только одного экземпляра?

Ответы [ 4 ]

7 голосов
/ 13 января 2010

вы забыли назначить вновь создаваемый экземпляр myDataset

if(myDataSet == null)
{
    myDataSet = new MyDataSet();
}
return myDataSet
2 голосов
/ 13 января 2010

Вы не установили 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();
        }

            return myDataSet;

    }
1 голос
/ 13 января 2010
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;
        }
    }
0 голосов
/ 13 января 2010

Взгляните на эту статью от Джона Скита. Как уже говорили другие, вы не устанавливаете переменную, но вы также можете реализовать более надежный шаблон или, возможно, избавиться от синглтона. Так как вы можете создать несколько экземпляров MyDataSet.

Я бы пошел с четвертой или пятой версией, если вам нужен синглтон.

...