Что такое использование статической переменной в C#? Когда его использовать? Почему я не могу объявить статическую переменную внутри метода?

Я искал о статических переменных в C#, но я все еще не понимаю, что его использование. Кроме того, если я попытаюсь объявить переменную внутри метода, она не даст мне разрешения на это. Почему?

Я видел несколько примеров о статической переменной. Я видел, что нам не нужно создавать экземпляр класса для доступа к переменной, но это не достаточно, чтобы понять, что его использование и когда его использовать.

второй вещь

class Book
{
    public static int myInt = 0;
}

public class Exercise
{
    static void Main()
    {
        Book book = new Book();

        Console.WriteLine(book.myInt); // Shows error why does it show me error?
                                       // Can't I access the static variable 
                                       // by making the instance of a class?

        Console.ReadKey();
    }
}

11 ответов


A static переменная разделяет ее значение между всеми экземплярами класса.

пример без объявления его статическим:

public class Variable
{
    public int i = 5;
    public void test()
    {
        i = i + 5;
        Console.WriteLine(i);
    }
}


public class Exercise
{
    static void Main()
    {
        Variable var = new Variable();
        var.test();
        Variable var1 = new Variable();
        var1.test();
        Console.ReadKey();
    }
}

пояснение: Если вы посмотрите на приведенный выше пример, я просто объявить int переменной. Когда я запускаю этот код, вывод будет 10 и 10. Все просто.

теперь давайте посмотрим на статическую переменную здесь; я объявляю переменную как static.

пример со статическим переменная:

public class Variable
{
    public static int i = 5;
    public void test()
    {
        i = i + 5;
        Console.WriteLine(i);
    }
}


public class Exercise
{
    static void Main()
    {
        Variable var = new Variable();
        var.test();
        Variable var1 = new Variable();
        var1.test();
        Console.ReadKey();
    }
}

теперь, когда я запускаю выше кода, вывод будет 10 и 15. Таким образом, значение статической переменной является общим для всех экземпляров этого класса.


в C# не статический!--1-->переменные на всех. Вы можете объявить static поле в определенном определении типа через C#. Статическое поле-это состояние, общее для всех экземпляров определенного типа. Следовательно, область статического поля-это весь тип. Вот почему вы не можете объявить static поле внутри метода-метод является самой областью, и элементы, объявленные в методе, должны быть недоступны через границу метода.


статические переменные используются, когда требуется только одна копия переменной. поэтому, если вы объявляете переменную внутри метода, такая Переменная не используется, она становится локальной только для работы..

пример статического составляет

class myclass
{
    public static int a = 0;
}

переменные объявлены как static, являются общими для всех экземпляров класса.

переменные объявлены как static, являются общими для всех экземпляров класса. При создании нескольких экземпляров класса VariableTest Эта переменная permanent является общей для всех из них. Таким образом, в любой момент времени в постоянной переменной будет только одно строковое значение.

поскольку для всех экземпляров доступна только одна копия переменной, код этот.permament приведет к ошибкам компиляции, потому что можно напомнить, что это.variablename ссылается на имя переменной экземпляра. Таким образом, статические переменные должны быть доступны напрямую, как указано в коде.


некоторые примеры" реального мира " для статических переменных:

создание класса, в котором вы можете достичь жестко закодированных значений для вашего приложения. Аналогично перечислению, но с большей гибкостью в типе данных.

public static class Enemies
{
    public readonly static Guid Orc = new Guid("{937C145C-D432-4DE2-A08D-6AC6E7F2732C}");
}

широко известный синглтон, это позволяет управлять ровно одним экземпляром класса. Это очень полезно, если вы хотите получить доступ к нему во всем приложении, но не передавать его каждому классу, чтобы этот класс мог использовать он.

public sealed class TextureManager
    {
        private TextureManager() {}
        public string LoadTexture(string aPath);

        private static TextureManager sInstance = new TextureManager();

        public static TextureManager Instance
        {
            get { return sInstance; }
        }
    }

и вот как вы бы назвали texturemanager

TextureManager.Instance.LoadTexture("myImage.png");

о вашем последнем вопросе: Вы ссылаетесь на ошибку компилятора CS0176. Я попытался найти больше информации об этом, но смог найти только то, что msdn должен был сказать об этом:

статический метод, поле, свойство или событие вызывается в классе даже когда экземпляр класса создается. Если все экземпляры класс создан, они не могут быть используется для доступа к статическому член. Существует только одна копия статических полей и событий. методы и свойства могут обращаться только к статическим полям и статическим события.


члены данных и члены функций, которые работают с экземпляром типа называются членами экземпляра. Метод ToString int (например)являются примерами членов экземпляра. По умолчанию члены являются членами экземпляра. Члены данных и члены функции, которые работают не с экземпляром типа, а с самим типом, должны быть помечены как статические. испытание.Главная и консоль.Методы WriteLine являются статическими методами. Класс Console фактически является статическим классом, что означает все его члены статичны. Вы никогда не создаете экземпляры консоли-одна консоль является общей для всего приложения.


статические классы не требуют создания объекта этого класса / создания экземпляра, вы можете префикс ключевого слова c# static перед именем класса, чтобы сделать его статическим.

помните: мы не создаем экземпляр консольного класса, класса String, класса Array.

class Book
{
    public static int myInt = 0;
}

public class Exercise
{
    static void Main()
    {
        Book book = new Book();
       //Use the class name directly to call the property myInt, 
      //don't use the object to access the value of property myInt

        Console.WriteLine(Book.myInt);

        Console.ReadKey();

    }
}

в ответ на "когда его использовать? вопрос:

Я часто использую статическую переменную (class), чтобы назначить уникальный идентификатор экземпляра каждому экземпляру класса. Я использую тот же код в каждом классе, это очень просто:

//Instance ID ----------------------------------------
    // Class variable holding the last assigned IID
    private static int xID = 0;
    // Lock to make threadsafe (can omit if single-threaded)
    private static object xIDLock = new object();
    // Private class method to return the next unique IID 
    //  - accessible only to instances of the class
    private static int NextIID()                    
    {
        lock (xIDLock) { return ++xID; }
    }
    // Public class method to report the last IID used 
    // (i.e. the number of instances created)
    public static int LastIID() { return xID; }
    // Instance readonly property containing the unique instance ID
    public readonly int IID = NextIID();
//-----------------------------------------------------

это иллюстрирует несколько моментов о статических переменных и методах:

  1. статические переменные и методы связаны с классом, а не с каким-либо конкретным экземпляром класса.
  2. можно вызвать статический метод в конструкторе экземпляра-в этом случае статический метод NextIID используется для инициализации свойства IID readonly, которое является уникальным идентификатором для данного экземпляра.

Я нахожу это полезным, потому что я разрабатываю приложения, в которых используются рои объектов, и хорошо иметь возможность отслеживать, сколько было создано, и отслеживать/запрашивать отдельные экземпляры.

Я также использую переменные класса для отслеживания таких вещей, как итоги и средние значения свойств экземпляров о чем можно сообщить в режиме реального времени. Я думаю, что класс является хорошим местом для хранения сводной информации обо всех экземплярах класса.


при сравнении с переменными сеанса статические переменные будут иметь одинаковое значение для всех пользователей, учитывая, что я использую приложение, развернутое на сервере. Если два пользователя обращаются к одной и той же странице приложения, статическая переменная будет содержать последнее значение и одно и то же значение будет предоставлено обоим пользователям в отличие от переменных сеанса, которые отличаются для каждого пользователя. Итак, если вы хотите что-то общее и одинаковое для всех пользователей, включая значения, которые должны использоваться вместе затем код приложения использует только static.


вам не нужно создавать экземпляр объекта, потому что yau будут использовать статическая переменная: Приставка.Метода WriteLine(Книга.myInt);


попробуйте вызвать его напрямую с именем класса Book.myInt


статическая переменная сохраняет свое предыдущее значение до выхода программы. Static используется при вызове непосредственно class_Name.Метод() или имя_класса.Свойство. Ссылка на объект не требуется. Наиболее популярным использованием статики является математический класс C#. Математика.Грех(), Математика.Cos (), Математика.Функция sqrt.)(