Яке використання статичної змінної в C #? Коли його використовувати? Чому я не можу оголосити статичну змінну всередині методу?


106

Я шукав статичні змінні в 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();
    }
}

4
Ви можете мати на увазі "статичне поле"?
Денніс

Як ми оголошуємо в класі статичний int i = 5
Картік Патель

3
VB.NET підтримує локальні статичні змінні. Їм довелося реалізувати це, щоб залишатися сумісним з vb. Кількість коду, яку він створює, величезна , локальні статики важкі, оскільки вони не є безпечними для потоків. Поля також не є безпечними для потоків, але всі очікують цього.
Ганс Пасант

не забудьте позначити відповідь як прийняту, якщо ви отримали потрібну інформацію ...
Pranay Rana

3
Ви можете отримати доступ до статичних змінних / методів через тип (в даному випадку Book) ні через екземпляр ( book), тому простіше рішення Book.myInt.
Джайдер

Відповіді:


171

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. Таким чином, значення статичної змінної поділяється між усіма примірниками цього класу.


9
@Pranay: Так, це краще, але якщо ти покажеш мені приклад, який я показую вище, ніж це кундук, краще для мене та інших .... все одно гарні зусилля ....
Kartik Patel

1
Він є статичним для класу, тобто його значення залишається вірним класу з його значенням, яке зберігається в його ... чекай його ... клас
chwi

Ви кажете, що статична змінна поділяється між усіма примірниками класу ... але що робити, якщо екземплярів немає? Можна ще встановити змінну? Чи дозволяється зберігати динамічні дані в статичному класі?
Кокодоко

@Kokodoko, навіть якщо екземпляра немає, ви точно можете встановити змінну. Це визначає його статичну природу
Ladmerc

33

C # взагалі не мають статичних змінних . Ви можете оголосити статичне поле у визначеному типі визначення за допомогою C #. Статичне поле - це стан, яке ділиться з усіма примірниками певного типу. Отже, область статичного поля - це весь тип. Ось чому ви не можете оголосити статичне поле в межах методу - метод є областю сам по собі, а елементи, оголошені в методі, повинні бути недоступними через межу методу.


5
Ну, в документації зазначено як "Поле, оголошене статичним модифікатором, називається статичною змінною." msdn.microsoft.com/en-us/library/aa691162(v=vs.71).aspx Але ви праві, решта пояснень.
Теоман шипахі

19

статичні змінні використовуються, коли потрібна лише одна копія змінної. тому якщо ви оголошуєте змінну всередині методу, немає використання такої змінної, вона стає локальною лише для функціонування ..

Приклад статичного є

class myclass
{
    public static int a = 0;
}

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

Змінні, оголошені статичними, зазвичай поділяються у всіх примірниках класу. Під час створення декількох примірників класу VariableTest Ця змінна постійна поділяється для всіх них. Таким чином, у будь-який момент часу буде лише одне значення рядка, що міститься в постійній змінній.

Оскільки існує лише одна копія змінної, доступна для всіх примірників, код this.permament призведе до помилок компіляції, оскільки можна нагадати, що this.variablename відноситься до імені змінної екземпляра. Таким чином, статичні змінні мають бути доступними безпосередньо, як зазначено в коді.


Ви можете пояснити, будь ласка, прикладом?
Картік Патель

але якщо я роблю екземпляр класу, то я не в змозі отримати доступ до статичної змінної. Чому? Я можу отримати доступ до статичної змінної за допомогою classname.variable не тільки, роблячи екземпляр класу .......... ......
Картік Патель

@Kartik Patel, оскільки вам потрібно використовувати ім'я класу для доступу до статичного myInt. Чому це так, я не знаю. Але я б сказав, що це набагато зрозуміліше, оскільки ви хочете отримати доступ до статичної частини класу, це не статично, якщо вам потрібен екземпляр для доступу до нього.
тимчасово

@dowhilefor: Але, як ви вже згадували вище, "Змінні, оголошені статичними, зазвичай поділяються у всіх примірниках класу." то в чому сенс цього?
Картік Патель

@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.Instance.LoadTexture("myImage.png");

Про ваше останнє запитання: Ви посилаєтесь на помилку компілятора CS0176 . Я спробував знайти більше інформації про це, але міг знайти лише те, що про це повинен сказати msdn:

Статичний метод, поле, властивість або подія можна викликати в класі навіть тоді, коли не створено жодного примірника класу. Якщо створені будь-які екземпляри класу, їх не можна використовувати для доступу до статичного члена. Існує лише одна копія статичних полів та подій, а статичні методи та властивості можуть отримати доступ лише до статичних полів та статичних подій.


5

Статичні змінні використовуються, коли потрібна лише одна його копія. Поясню це на прикладі:

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

Тепер ми створили для нашого classкола два екземпляри , тобто створено 2 набори копій _PI разом з іншими змінними. Так що скажіть, якщо у нас буде багато примірників цього класу, _PIбуде створено кілька копій , що займають пам'ять. Тож у таких випадках краще робити такі змінні, як _PI staticі діяти над ними.

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

Тепер, незалежно від того, скільки примірників зроблено для classкола, існує лише одна копія змінної, яка _PIзберігає нашу пам'ять.


4

Статичні класи не вимагають від вас створювати об'єкт цього класу / інстанціювати їх, ви можете встановити префікс ключового слова C # перед назвою класу, щоб зробити його статичним.

Пам'ятайте: ми не інстанціюємо клас 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();

    }
}

дуже добре спостереження, тому що якщо ви спробуєте використати об'єкт для доступу до значення властивості, якщо ви отримаєте помилку: static void Main () {Book book = new Book (); // це дасть вам помилку: book.myInt = 5;
leonidaa

2

Починаючи з цього прикладу @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. Змінна інстанція змінної класу VS в C #

    Члени статичного класу Змінна класу C # АБО

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

    }

введіть тут опис зображення введіть тут опис зображення введіть тут опис зображення введіть тут опис зображення

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

Члени даних і члени функцій, які працюють над екземпляром типу, називаються членами екземпляра. Метод Tottring int (наприклад) - приклади членів екземпляра. За замовчуванням члени є членами екземплярів. Члени даних та члени функцій, які не працюють на екземплярі типу, а саме на самому типі, повинні бути позначені як статичні. Методи Test.Main та Console.WriteLine є статичними методами. Клас Консолі - це фактично статичний клас, що означає, що всі його члени є статичними. Насправді ви ніколи не створюєте екземпляри консолі - одна консоль поділяється у всій програмі.


1

У відповідь на "коли його використовувати?" питання:

Я часто використовую статичну змінну (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 використовується для ініціалізації властивості readDonly IID, яка є унікальним ідентифікатором для цього екземпляра.

Я вважаю це корисним, оскільки розробляю програми, в яких використовуються рої об'єктів, і це добре, щоб можна було відслідковувати кількість створених, а також відстежувати / запитувати окремі екземпляри.

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


0

Спробуйте зателефонувати йому безпосередньо з назвою класу Book.myInt


точно дивіться приклад @Kunal Mukherjee зверху
leonidaa

0

У порівнянні зі змінними сеансу, статичні змінні матимуть однакове значення для всіх користувачів, вважаючи, що я використовую програму, розгорнуту на сервері. Якщо два користувачі переходять на одну і ту ж сторінку програми, то статична змінна буде містити останнє значення і однакове значення буде надано обом користувачам на відміну від змінних сеансів, що відрізняється для кожного користувача. Отже, якщо ви хочете щось спільне і те саме для всіх користувачів, включаючи значення, які повинні використовуватись уздовж коду програми, тоді використовуйте лише статичні.


0

Вам не потрібно створювати об'єкт, тому що ви будете використовувати статичну змінну: Console.WriteLine (Book.myInt);


-1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.