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

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

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

Вторая вещь

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

class myclass
{
    public static int a = 0;
}

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

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

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

Ответ 4

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

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

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

и так вы можете называть textmanager

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

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

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

Ответ 5

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

Помните: мы не создаем экземпляр класса Console, класса 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();

    }
}

Ответ 6

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

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 экземпляра для нашего круга 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, сохраняющая нашу память.

Ответ 7

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

Ответ 8

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

Я часто использую переменную static (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();
//-----------------------------------------------------

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

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

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

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

Ответ 9

Начиная с этого примера @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 Переменная экземпляра в С#

    Статические члены класса С# ИЛИ Переменная класса

    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

Ответ 10

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

Ответ 11

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

Ответ 12

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

Ответ 13

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