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

94

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

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

Second thing

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();
    }
}
не забудьте пометить ответ как принятый, если вы получили необходимую информацию ... Pranay Rana
Как мы объявляем в классе static int i = 5 Kartik Patel
VB.NET поддерживает локальные статические переменные. Они должны были реализовать это, чтобы оставаться совместимым с VB. Количество генерируемого кода:enormous, локальная статика сложна, потому что она не поточнобезопасна. Поля также не являются потокобезопасными, но все ожидают этого. Hans Passant
Вы можете получить доступ к статическим переменным / методам через тип (в этом случаеBook) нет через экземпляр (book), поэтому более простое решениеBook.myInt. Jaider
Может быть, вы имеете в виду «статическое поле»? Dennis

Ваш Ответ

13   ответов
0

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

0

Вам не нужно создавать экземпляр объекта, потому что вы собираетесь использовать статическая переменная: ЕЫпе (Book.myInt);

16

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

Пример статического

class myclass
{
    public static int a = 0;
}

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

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

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

@dowhilefor: Но, как вы упомянули выше, переменные, объявленные как статические, обычно используются всеми экземплярами класса. & quot; тогда в чем смысл этого? Kartik Patel
Можете ли вы объяснить с примером? Kartik Patel
@Kartik Patel, потому что вы должны использовать имя класса для доступа к статическому myInt. Почему это так, я не знаю. Но я бы сказал, что это намного понятнее, потому что вы хотите получить доступ к статической части класса, это не статично, если вам нужен экземпляр для доступа к нему.
@ Kartik Patel, вы не можете получить доступ к переменной извне с помощью экземпляра, но вы всегда можете использовать статическую переменную внутри вашего класса, и тогда она будет доступна всем экземплярам. Также не я дал этот ответ, я просто комментирую его.
3

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

Помните: мы не создаем экземпляр класса Console, String class, Array Class.

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();

    }
}
очень хорошее наблюдение, потому что если вы попытаетесь использовать объект для доступа к значению свойства myInt, вы получите ошибку: static void Main () {Book book = new Book (); // это дает вам ошибку: book.myInt = 5;
1

Начиная с этого примера @Kartik Patel, я немного изменился, может быть, теперь более ясно о статической переменной

 public class Variable
    {
        public static string StaticName = "Sophia ";
        public string nonStName = "Jenna ";
        public void test()
        {
            StaticName = StaticName + " Lauren"; 
            Console.WriteLine("  static ={0}",StaticName);
            nonStName = nonStName + "Bean ";
            Console.WriteLine("  NeStatic neSt={0}", nonStName);

        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Variable var = new Variable();
            var.test();
            Variable var1 = new Variable();
            var1.test();
            Variable var2 = new Variable();
            var2.test();
            Console.ReadKey();

        }
    }

Output 
  static =Sophia  Lauren
  NeStatic neSt=Jenna Bean
  static =Sophia  Lauren Lauren
  NeStatic neSt=Jenna Bean
  static =Sophia  Lauren Lauren Lauren
  NeStatic neSt=Jenna Bean
  1. Class Variable VS Instance Variable in C#

    Static Class Members C# OR Class Variable

    class A
    {
        // Class variable or " static member variable"  are declared with 
        //the "static " keyword
    
        public static int i=20;
        public int j=10;         //Instance variable 
        public static string s1="static class variable"; //Class variable 
        public string s2="instance variable";        // instance variable 
    }
    class Program
    {
        static void Main(string[] args)
        {
            A obj1 = new A();
    
            // obj1 instance variables 
            Console.WriteLine("obj1 instance variables ");
            Console.WriteLine(A.i);
            Console.WriteLine(obj1.j);
            Console.WriteLine(obj1.s2);
            Console.WriteLine(A.s1);
    
            A obj2 = new A();
    
            // obj2 instance variables 
            Console.WriteLine("obj2 instance variables ");
            Console.WriteLine(A.i);
            Console.WriteLine(obj2.j);
            Console.WriteLine(obj2.s2);
            Console.WriteLine(A.s1);
    
            Console.ReadKey();
    
        }
    
    
    }
    

    }

enter image description here enter image description here enter image description here enter image description here

https://en.wikipedia.org/wiki/Class_variable

https://en.wikipedia.org/wiki/Instance_variable

https://en.wikipedia.org/wiki/Static_variable

https://javaconceptoftheday.com/class-variables-and-instance-variables-in-java/?fbclid=IwAR1_dtpHzg3bC5WlGQGdgewaTvuOI6cwVeFUtTV8IZuGTj1qH5PmKGwX0yM

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members

1

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

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

//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. Static variables and methods are associated with the class, not any specific instance of the class.
  2. A static method can be called in the constructor of an instance - in this case, the static method NextIID is used to initialize the readonly property IID, which is the unique ID for this instance.

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

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

1

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

class circle
        {
           public float _PI =3.14F;
           public int Radius;


           public funtionArea(int radius)
            {
                return this.radius * this._PI      
            }

        }
    class program
    {
      public static void main()
      {
       Circle c1 = new Cirle();
       float area1 = c1.functionRaduis(5);

       Circle c2 = new Cirle();
       float area2 = c1.functionRaduis(6);

      }

    }

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

    class circle
        {
           static float _PI =3.14F;
           public int Radius;


           public funtionArea(int radius)
            {
                return this.radius * Circle._PI      
            }

        }
    class program
    {
      public static void main()
      {
       Circle c1 = new Cirle();
       float area1 = c1.functionRaduis(5);

       Circle c2 = new Cirle();
       float area2 = c1.functionRaduis(6);

      }

    }

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

29

C # не статиченvariables совсем. Вы можете объявить статическийfield в конкретном определении типа через C #. Статическое поле - это состояние, которое используется всеми экземплярами определенного типа. Следовательно, область действия статического поля является целым типом. Вот почему вы не можете объявить статическийfield внутри метода - метод представляет собой саму область действия, и элементы, объявленные в методе, должны быть недоступны через границу метода.

приятное объяснение.
Ну, в документации это указано как «Поле, объявленное с помощью статического модификатора, называется статической переменной».msdn.microsoft.com/en-us/library/aa691162(v=vs.71).aspx Но вы правы в остальном объяснения.
156

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, Таким образом, значение статической переменной является общим для всех экземпляров этого класса.

Вы говорите, что статическая переменная является общей для всех экземпляров класса ... но что, если экземпляров нет? Вы все еще можете установить переменную? Разрешено ли хранить динамические данные в статическом классе?
Он статичен по отношению к классу, т. Е. Его значение остается верным классу, а его значение хранится в его классе ... wait for it ...
что я уже упоминал в своем ответе .......
@Kokodoko, даже если нет экземпляра, вы наверняка можете установить переменную. Это определяет его статическую природу
@Pranay: Да, это лучше, но если вы покажете мне пример, который я показываю выше, чем это может быть лучше для меня и других .... в любом случае, хорошие усилия .... Kartik Patel
9

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

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

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 должен был сказать об этом:

A static method, field, property, or event is callable on a class even when no instance of the class has been created. If any instances of the class are created, they cannot be used to access the static member. Only one copy of static fields and events exists, and static methods and properties can only access static fields and static events.

1

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

-1

Статическая переменная сохраняет свое предыдущее значение до завершения программы. Статический используется, вызывая напрямую class_Name.Method () или class_Name.Property. Ссылка на объект не требуется. Наиболее популярным использованием статического кода является математический класс C #. Math.Sin (), Math.Cos (), Math.Sqrt ().

0

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

точно, посмотрите пример @Kunal Mukherjee сверху

Похожие вопросы