【问题标题】:How is the method called in static class静态类中的方法是如何调用的
【发布时间】:2015-03-06 06:00:15
【问题描述】:

我的代码如下

   class MyStaticClass
   {

     static MyStaticClass{};

    public static readonly MyStaticClass Instance = CreateMe();
    public static int GetSomeValue = GetValue();

    private static int GetValue()
    {
        return 0;
    }

    private static MyStaticClass CreateMe()
    {
        Console.WriteLine("This method was called");
        return new MyStaticClass();
    }

}

公开课课程 {

    public static void Main()
    {

         int val=MyStaticClass.GetSomeValue;

    }
 }

O/p:

This method was called

当我调用val 时,为什么调试器会访问CreateMe 方法?是不是我访问的任何静态方法都会访问类中的所有静态方法?

【问题讨论】:

  • 问题标题需要修改,因为问题代码中没有静态类。

标签: c# static


【解决方案1】:

调用CreateMe() 方法是因为您在以下语句中创建对象Instance 时正在调用。

 public static readonly MyStaticClass Instance = CreateMe();

这是您的类中的静态对象,在您访问 MyStaticClass.GetSomeValue 所做的类时创建。

Dubugging the code 将让您清楚地了解语句执行的顺序。你可以在 MSDN 上阅读这篇关于调试的详细文章Debugger Roadmap

【讨论】:

  • 你的意思是说当我输入MyStaticClass.GetSomeValue 关键字MyStaticClass 会调用实例?
  • 不是关键字,而是访问类 MyStaticClass。这可能是由于访问静态属性或方法等。
  • 好的,所以我访问除“实例”之外的任何方法都会默认初始化所有静态方法?
  • 静态方法不会被隐式调用,您在创建名称为 Instance 的对象时已显式调用。当您通过类访问任何成员时,所有静态数据成员都会被初始化/实例化。
【解决方案2】:

您有一个静态字段的静态初始化程序。作为程序启动的一部分,将评估所有静态字段。

编辑:这里的小说明:

特定类中的静态字段按声明顺序进行评估,但没有特定顺序首先初始化哪个类的静态字段。 现在,如果你有一个静态属性,那就不一样了。

MSDN link

【讨论】:

  • All static fields are evaluated in no particular order +1
  • 顺序不是随机的。您链接中的第一句话说它是按文本顺序排列的。所以首先是Instance,然后是GetSomeValue,然后是静态构造函数。
【解决方案3】:

这两个字段都已使用静态方法进行了初始化。所以,在这种情况下,所有的静态方法都会被评估。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多