【问题标题】:Static variable inside class类内的静态变量
【发布时间】:2018-08-12 13:13:04
【问题描述】:

我对静态变量很困惑,实际上我是在程序下面执行的。

class ABC
{
    public static int prop { get; set; }
    const int i =5;
    static int j;

    public ABC()
    {
        prop = 8;
        j = 9;
        Console.WriteLine("Under ABC class's constructor.");
    }

    public int getValue()
    {
        j = 6;
        prop = 89;
        return j;
    }
}

class Program
{
    static void Main(string[] args)
    {
        ABC obj = new ABC();
        Console.WriteLine(obj.getValue());
        //Console.WriteLine(ABC.j);
        Console.ReadLine();
    }
}

并且它的执行没有任何编译或运行时错误。

我有以下困惑。

  • 我们可以在非静态构造函数中分配静态变量/属性吗?
  • 我们也可以在实例方法中分配静态变量/属性吗?
  • 如果我们可以在以上两种情况下对静态变量/属性进行赋值,那么静态构造函数有什么用?
  • 最后,我们可以分配/初始化静态变量/属性的类中的哪些位置?

【问题讨论】:

  • 请解释the official documentation about the static keyword的内容不够清楚。
  • 是的,camilo,我阅读了这个文档,我主要关心的是,如果我们可以从同一个类中的任何位置(如普通变量)分配静态变量/属性,那么静态构造函数有什么用?正如我从一开始就知道的那样,静态构造函数用于初始化/将值分配给类的静态变量。
  • 有些会员否决了我的问题,请阅读完整的问题,然后想想我是否做过任何研究?

标签: c# static


【解决方案1】:

我们可以在非静态内部分配静态变量/属性吗 构造函数?

是的。

我们可以在实例方法中分配静态变量/属性吗 还有吗?

是的。

如果我们可以在以上两种情况下对静态进行赋值 变量/属性那么静态构造函数有什么用?

静态构造函数也称为类型初始化器。它负责初始化它所定义的类型。您可以使用它来执行可以预先完成的计算,并且对于该类型的所有实例都是相同的。因此,您将在创建实例时节省一些执行时间,因为 计算已经由类型初始值设定项完成。请注意,类型初始化程序在第一次使用该类型之前运行。因此,您无法确定地判断它何时实际运行。您也无法捕获它引发的异常,因为您实际上并没有自己调用类型初始化程序。因此,您需要注意不要将容易出错的操作放入类型初始化器中(例如,不要在其中执行 IO 操作)。

最后,我们可以在类中的哪些位置 分配/初始化静态变量/属性?

从任何地方。请注意,即使跨线程,您也可以从任何地方读取和写入静态成员。这使得很难找到由于内存中某处的静态程序突变而可能发生的错误。

附带说明:尽量避免使用可变静态内存以使您的应用程序更简单。如果你真的需要......你应该考虑locking 访问静态资源以防止数据竞争。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 2011-09-01
    • 2012-07-03
    • 2021-11-02
    • 2018-03-06
    • 2016-11-08
    • 1970-01-01
    相关资源
    最近更新 更多