栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

C# 静态构造函数

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C# 静态构造函数

目录
    • 写在前面
    • 语法格式
    • 用法与特性
      • 主要作用
      • 语法特性
    • 关于泛型的测试
      • 测试代码
      • 运行结果


写在前面

今天在创建WPF自定义控件时,在模板代码中看到了静态构造函数这种写法,说来惭愧,以前在Java用过这种语法,心知C#也应该会有的,但在实际开发中从未使用过(因为偷懒,涉及CLR的当时懒得查,回头就忘了)。但静态构造函数在初始化静态数据时确实很有作用,省去了对象初始化时的判断操作(我之前就是这样一直偷懒的)。

以下是VisualStudio自动生成的模板代码:

语法格式
class User
{
    // 静态构造函数
    static User()
    {
       // 你的代码
    }
}

用法与特性 主要作用
  1. 执行仅需执行一次的特定操作。
  2. 初始化任何静态数据。

理论上,一个静态构造函数在一个应用程序的完整生命周期中,最多只会被自动执行一次。
之所以说“自动”,是因为静态构造函数的执行是由CLR完成的。
之所以说“最多”,是因为CLR将在创建第一个实例或引用任何静态成员之前自动调用静态构造函数。

语法特性
  1. 静态构造函数不允许使用访问修饰符。
  2. 静态构造函数必须无参数。
  3. 一个类(或结构体)只能有一个静态构造函数。
  4. 静态构造函数不能继承或重载。
  5. 静态构造函数只允许被公共语言运行时 (CLR) 自动调用,不允许直接调用。
  6. 不同类型的静态构造函数执行的顺序与运行时调用的顺序有关。

关于泛型的测试

如果使用了泛型,指定不同的类型是否会多次触发静态构造函数呢?
对此写了一个代码进行测试。

测试代码
// 测试类型1号
class Test
{
    public static int Value { get; set; }

    static Test()
    {
        Console.WriteLine($"执行【静态构造函数】,类型为:{typeof(Test)}");
    }

    public Test()
    {
        Console.WriteLine($"执行【普通构造函数】,类型为:{this.GetType()},值为:{Value}");
    }
}

// 测试类型2号
class User
{
    static User()
    {
        Console.WriteLine("未引用到的类型不会被执行。");
    }
}

Program.cs中测试代码如下:

new Test();
new Test();
new Test();
Console.WriteLine();

new Test();
Console.WriteLine();

Test.Value = 10;
Console.WriteLine();

Test.Value = 20;
new Test();
Console.ReadLine();

运行结果

命令行窗口截图:

由此可以看出,指定不同的泛型类型,其静态构造函数是相互独立的;
另外,User类型未被调用过,所以没有执行静态构造函数,也就没有对应的打印输出。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/907613.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号