在C#中使用静态变量有什么用?什么时候用?为什么我不能在方法中声明静态变量?

Kar*_*tel 98 c# static static-variables

我在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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Kar*_*tel 164

一个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();
    }
}
Run Code Online (Sandbox Code Playgroud)

说明:如果查看上面的示例,我只是声明int变量.当我运行此代码时,输​​出将是1010.这很简单.

现在让我们看一下静态变量; 我将变量声明为a 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我运行上面的代码时,输​​出将是1015.因此静态变量值在该类的所有实例之间共享.

  • @Pranay:是的,那会更好,但是如果你告诉我一些我上面展示的例子,那对我和其他人来说会更好....无论如何好努力.... (9认同)

Den*_*nis 32

C#根本没有静态变量.您可以通过C#在特定类型定义中声明静态字段.静态字段是一种状态,与特定类型的所有实例共享.因此,静态字段的范围是整个类型.这就是为什么你不能在方法中声明静态字段的原因- 方法本身就是一个范围,方法中声明的项必须在方法的边界上不可访问.

  • 好吧,在文档中,它被声明为"使用static修饰符声明的字段称为静态变量".https://msdn.microsoft.com/en-us/library/aa691162(v=vs.71).aspx但你对其余的解释是正确的. (5认同)

Pra*_*ana 18

当只需要一个变量副本时,使用静态变量.所以如果你在方法中声明变量就没有使用这样的变量,它只会变成局部函数.

静态的例子是

class myclass
{
    public static int a = 0;
}
Run Code Online (Sandbox Code Playgroud)

声明为static的变量通常在类的所有实例中共享.

声明为static的变量通常在类的所有实例中共享.创建VariableTest类的多个实例时,所有变量永久共享.因此,在任何给定的时间点,永久变量中只包含一个字符串值.

由于只有一个变量副本可用于所有实例,因此代码this.permament将导致编译错误,因为可以回想一下this.variablename是指实例变量名称.因此,如代码所示,直接访问静态变量.


dow*_*for 9

静态变量的一些"真实世界"示例:

构建一个类,您可以在其中获得应用程序的硬编码值.与枚举类似,但数据类型具有更大的灵活性.

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

广为人知的单例,这允许控制只有一个类的实例.如果您希望在整个应用程序中访问它,但是不将它传递给每个类只是为了允许这个类使用它,这非常有用.

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

        private static TextureManager sInstance = new TextureManager();

        public static TextureManager Instance
        {
            get { return sInstance; }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这就是你如何调用texturemanager

TextureManager.Instance.LoadTexture("myImage.png");
Run Code Online (Sandbox Code Playgroud)

关于您的上一个问题:您正在引用编译器错误CS0176.我试图找到更多信息,但只能找到msdn对它的评价:

即使没有创建类的实例,静态方法,字段,属性或事件也可在类上调用.如果创建了类的任何实例,则不能使用它们来访问静态成员.只存在静态字段和事件的一个副本,静态方法和属性只能访问静态字段和静态事件.


小智 8

当只需要一个副本时使用静态变量。让我用一个例子来解释这一点:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我们已经为我们的classcircle创建了 2 个实例,即创建了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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在无论为classcircle制作了多少个实例,都只存在一个_PI保存我们内存的变量副本。


Kun*_*jee 5

静态类不需要您创建该类的对象/实例化它们,您可以在类名前添加 C# 关键字 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();

    }
}
Run Code Online (Sandbox Code Playgroud)