SunilKumar.Mandadi Ответов: 1

Как статическая переменная может сохранять увеличенное значение


Я создал статическую переменную в классе и увеличил ее в конструкторе, думая, что всякий раз, когда я создаю экземпляр класса, статическая переменная будет сброшена до 0. К моему крайнему удивлению, в первый раз, когда я создал объект для класса, статическая переменная(счетчик) увеличивается до 1. Во второй раз, когда я создал объект для класса, статическая переменная сохраняет увеличенное значение(1). Таково ли поведение статики?

Что я уже пробовал:

class Singleton
   {
       private static int counter = 0;
       Public Singleton()
       {
           counter++;
           Console.WriteLine("Counter-" + counter);
       }
   }

  static void Main(string[] args)
       {
           Singleton objSingleton = Singleton.getInstanse;
           objSingleton.getMessage("Hi This is my first message!");
           Singleton objSingleton2 = Singleton.getInstanse;
           objSingleton.getMessage("Hi This is my second message!");
       }

1 Ответов

Рейтинг:
2

OriginalGriff

Это не ваш код: я могу сказать по двум причинам.
1) он не будет компилироваться - C# чувствителен к регистру, и Public это не то же самое, что public
2) Ваш Singleton класс, как показано на рисунке, не содержит getInstanse метод, который имеет решающее значение для вашей проблемы.

Вся идея одноэлементного класса заключается в том, что в системе существует один и только один экземпляр класса - поэтому конструктор всегда объявляется как private, нет public таким образом, он может быть создан только внутри самого класса. Обычно это было бы в GetInstance метод или аналогичный, но экземпляр будет сохранен в private static переменная внутри класса:

class Singleton
    {
    private static int counter = 0;
    private static Singleton instance = null;
    private Singleton()
        {
        counter++;
        Console.WriteLine("Counter-" + counter);
        }
    public void getMessage(string s)
        {
        Console.WriteLine(s);
        }
    public static Singleton GetInstance()
        {
        if (instance == null) instance = new Singleton();
        return instance;
        }
    }

class Program
    {
    static void Main(string[] args)
        {
        Singleton objSingleton = Singleton.GetInstance();
        objSingleton.getMessage("Hi This is my first message!");
        Singleton objSingleton2 = Singleton.GetInstance();
        objSingleton.getMessage("Hi This is my second message!");

        Console.ReadLine();
        }
    }
И именно поэтому вы всегда получаете счетчик только 1: создается только один экземпляр.