C#泛型类的静态构造函数及静态成员[经典]

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

 C#泛型类的静态构造函数及静态成员[经典]

 

静态构造函数总是至多被调用一次吗?静态构造函数一定会被调用吗?看如下反例:

namespace ConsoleApplication1
{
    class Program:A<float>
    {
        static Program()
        {
            Console.WriteLine("Class Program static construct invoked.");
        }

        static void Main(string[] args)
        {
            Console.WriteLine(B.SomeValue++);
            Console.WriteLine(C.SomeValue++);
            Console.WriteLine(D.SomeValue++);
            Console.WriteLine(E.SomeValue++);
            Console.WriteLine(E.SomeValue2++);

            new F();
            new F();

            Console.ReadKey();

        }
    }

    class A<T>
    {
        public static int SomeValue=0;

        public A()
        {
            Console.WriteLine("Class A<{0}> dynamic construct invoked.", typeof(T).Name);
        }


        static A()
        {
            Console.WriteLine("Class A<{0}> static construct invoked.",typeof(T).Name);
        }
    }

    class B : A<string>
    {
        static B()
        {
            Console.WriteLine("Class B static construct invoked.");
        }
    }


    class C : A<int>
    {
        static C()
        {
            Console.WriteLine("Class C static construct invoked.");
        }
    }

    class D : A<int>
    {
        static D()
        {
            Console.WriteLine("Class D static construct invoked.");
        }
    }

    class E : A<float>
    {
        public static int SomeValue2 = 0;
        static E()
        {
            Console.WriteLine("Class E static construct invoked.");
        }
    }

    class F : A<bool>
    {
        public F()
        {
            Console.WriteLine("Class F dynamic construct invoked.");
        }

        static F()
        {
            Console.WriteLine("Class F static construct invoked.");
        }
    }

}


输出 如下:
Class Programe static construct invoked.
Class A<String> static construct invoked.
0
Class A<Int32> static construct invoked.
0
1
Class A<Single> static construct invoked.
0
Class E static construct invoked.
0
Class F static construct invoked.
Class A<Boolean> static construct invoked.
Class A<Boolean> dynamic construct invoked.
Class F dynamic construct invoked.
Class A<Boolean> dynamic construct invoked.
Class F dynamic construct invoked.

对输出结果分析如下:

//程序运行实际上是Framework调用Program 的Main静态方法,但不会实例化Program
Class Program static construct invoked.  
// 实际上静态成员并不支持继承,C#编译器会在底层将B.SomeValue翻译成A<string>.SomeValue
//所以被 加载的不是B,而是A<string>
Class A<String> static construct invoked. 
0
//同样此处C.SomeValue被翻译成A<int>.SomeValue
Class A<Int32> static construct invoked.
//诧异?被继承的SomeValue不是被“加加”了吗, 为何此处还是0
0
//看到了吧,SomeValue确实被“加加”了,不过A<string>与A<int>属 于不同的类型
//里面的SomeValue也是相互独立的
1
//E.SomeValue被翻译成 A<float>.SomeValue
Class A<Single> static construct invoked.
0
//此处的E.SomeValue2远远本本的就是E.SomeValue2当然E的静态构造函数会被执行。
// 现在我们才发觉B/C/D三者的静态构造函数都没被执行,原因呢,刚才也说了,实际上
//上面的B/C/D的引用在底层都被翻译成了A的封闭类, 所以加载的并不是B/C/D本身,而是
//相应的封闭类
Class E static construct invoked.
0
// 现在再来温习一下静态构造方法与构造方法的执行顺序
//因为new的是F,所以F首先被加载,进而执行F的静态构造
Class F static construct invoked.
//加载F后发现F是从A<bool>继承的,进而去加载 A<bool>,于是A<bool>的静态构造被执行
Class A<Boolean> static construct invoked.
//首先执行基类的构造方法
Class A<Boolean> dynamic construct invoked.
//而后是F自己的构造方法
Class F dynamic construct invoked.
//此两句因为A<bool>与F以被加载,静态构造已被执行,因而直接按顺序从低往高调用构造方法
Class A<Boolean> dynamic construct invoked.
Class F dynamic construct invoked.

QQ 1163551688
总结:
1.泛型类的各封闭类,属于不同的类,各自有自己独立的静态空间
2. 静态成员实际上不支持继承,C#编译器在底层将实际的引用确定成静态成员定义者
3.静态构造函数不一定会被执行,因为有的类,在执行过程中不会被 加载
4.静态构造函数确实是总是至多被调用一次,但是泛型类的静态构造要站在另一个角度考虑
5.类的构造函数执行顺序是自底而上
6. 类的静态构造函数执行顺序是不能确定的,因为编程过程中,类的使用顺序是不定的,静态构造函数总是在类第一次被用到的地方执行

 

【唐老狮】C#——封装:静态成员 ​​关于面向对象三大特性之封装,我们已经学习了许多知识点:类和对象、成员变量和访问修饰符、成员方法(函数)、构造函数和析构函数、成员属性、索引器。当你看到这些知识点时,如果发现自己已经不清楚或者忘记了,你可以再看看前几篇文章来进行回顾。 ​​今天我们要讲的是一个非常重要的知识点,是面试中经常会问到的内容——静态成员。 【静态成员静态关键字 static 静态成员 用static修饰的 成员变量 成员方法 成员属性 等 特点 直接... 阅读详情

相关推荐

Cadence 中Cutout、Design_Outline 和 Outline的区别

摘要: 在PCB设计中,Cutout、Design_Outline和Outline都与电路板外形相关但用途不同。Cutout用于定义切割区域(如孔、槽),直接影响制造;Design_Outline仅标记设计边界,作为参考不影响切割;Outline则是实际切割轮廓层,用于制造。三者区别在于:Cutout针对具体切割区域,Design_Outline是设计参考,Outline是最终切割依据。设计时需根据需求选择合适层:外形参考用Design_Outline/Outline,切割区域用Cutout。

卤煮小鱼的博客 1638

C#

一.所解决的问题及适用情形 假设我们声明了一个叫做MyIntStack的类,它实现了把一个int类的值压入栈以及把它们弹出。 class MyIntStack { int StackPointer = 0; int[] StackArray; public void Push(int x) { //... } public int Pop() { //... } } 然后我们希望相同的功能应用于flo.

ฅ两脚喵ฅ的博客 3458

FPGA实战:手把手教你实现VESA DSC编码(附Verilog代码解析)

本文详细介绍了如何使用FPGA实现VESA DSC编码器,包括核心架构设计、Verilog代码实现与优化技巧。通过流水线设计、色彩空间转换和预测编码等关键技术,帮助开发者掌握工业级DSC编码器的开发流程,并提供实用的调试与性能优化方法。

weixin_29165725的博客 369

[Unity] C#中级编程 - 04 - /构造函数/ref

[Unity中文课堂教程] C#中级编程 - 04 - /构造函数/ref 原教程视频地址: 《[Unity中文课堂教程预告片] C#中级编程_哔哩哔哩_bilibili》 《C#中级编程 - Unity中文课堂 (u3d.cn)》 《C# (Generic) | 菜鸟教程 (runoob.com)》 《C# 讲解_基础_C# Generic_天马3798-CSDN博客_c#》 内容短小精悍简练,每节只有几分钟。很适合用来预习和复习。 类的构造函数C# 类(Class) | 菜

Lovely_him的博客 1847

C#高级--详解

C#高级–详解 一、是什么? C#2.0推出的新语法,不是语法糖,而是2.0由框架升级提供的功能。 我们在编程程序时,经常会遇到功能非常相似的模块,只是它们处理的数据不一样。但我们没有办法,只能分别写多个方法来处理不同的数据类。这个时候,那么问题来了,有没有一种办法,用同一个方法来处理传入不同种类参数的办法呢?的出现就是专门来解决这个问题的。 使用是一种增强程序功能的技术,具体表现在以下几个方面: 它有助于您最大限度地重用代码、保护类的安全以及提高性能。 您可以创建集合类。

李宥的博客 1万+

c#——

(Generic),允许你编写一个可以与任何数据类一起工作的类或方法。类:class 类名<占位字符>函数:返回值类 函数名<占位字符>(参数类 参数1,......)是增强程序功能的技术* 1.最大限度的复用代码* 2.泛型类函数接口,委托,事件* 3.可以对进行约束,从而访问特定的数据类 where* 4.数据类的类信息可以利用反射在程序运行时获取。

m0_66433913的博客 1170

C# 概念及用法详解

(generic)是C# 2.0推出的新语法,它是专门为处理多段代码在不同的数据类上执行相同的指令的情况而设计的。比如说编程时,碰到功能非常相似的模块,只是它们所处理的数据类不同,然而我们却需要写不同的方法来实现它,很明显,这加大了我们的工作量,也很乏味。有没有什么办法能够解决这个问题呢?它就是了,可以让多个类共享一组代码。通过压栈例子可以更清楚的了解{int[] arr;//将int类的值压栈//将float类的值压栈。

u011555996的博客 1万+

C#中的静态类、静态成员静态构造函数

静态类 关键字static修饰的类称之为静态类。 静态类不能实例化。 static关键字可以防止程序员写代码实例化静态类,也可以防止在静态类的内部声明任何实例成员。 C#编译器会自动把静态类标记为sealed,这个关键字将类指定为不可扩展(不能从它派生出其他类)。 静态类特性:仅包含静态成员;无法实例化;属于密封类;不能包含实例构造函数(但可以包含静态构造函数)。 静态成员 ...

chenweicode的博客 4853

C#静态类,静态成员静态构造函数及执行顺序

静态类: 1.只能包含静态成员 2.不能被继承 3.不能被实例化,没有构造函数 //静态类只能包含静态成员 public static class A { public static int a = 1; } class Program { static void Main(string[] args) ...

菜鸟中的愤怒的小鸟 2763

c#继承、静态构造函数静态成员分析

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声...

weixin_43277501的博客 546

C# 静态类和静态成员

静态成员: 非静态类可以包含静态方法、字段、属性或事件。 即使未创建类的任何实例,也可对类调用静态成员静态成员始终按类名(而不是实例名称)进行访问。 静态成员只有一个副本存在(与创建的类的实例数无关)。 静态方法和属性无法在其包含类中访问非静态字段和事件,它们无法访问任何对象的实例变量,除非在方法参数中显式传递它。 更典的做法是声明具有一些静态成员的非静态类(而不是将整个类都声明为静态)。 静态字段的两个常见用途是保留已实例化的对象数的计数,或是存储必须在所有实例间共享的值。 静态方法可以进行

LiKe11807的博客 1590

深入理解C# 静态类与非静态类、静态成员的区别

深入理解C# 静态类与非静态类、静态成员的区别 静态静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类的变量。在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例化该静态类;其次,它防止在类的内部声明任何实例字段或方法。 静态类是自C# 2.0才引入的,C# 1.0不支持静态类声明。程序员必须声明一

jfkidear的专栏 1万+

C# 静态类与非静态类、静态成员的区别

转自:http://blog.sina.com.cn/s/blog_48a45b950100j68w.html; 静态静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new关键字创建静态类类的变量。在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例化该静态类;其次,它防止在类的内部声明任何实例字段或方法。 静态类是自...

weixin_30568715的博客 2312

C# 泛型类

泛型类实例化的理论 C#泛型类在编译时,先生成中间的代码IL,通常类T只是一个占位符。在实例化类时,根据用户指定的数据类代替T并由即时编译器(JIT)生成本地代码,这个本地代码中已经使用了实际的数据类,等同于用实际类写的类,所以不同的封闭类的本地代码是不一样的。按照这个原理,我们可以这样认为: 泛型类的不同的封闭类是分割不同的数据类。 例:Stack和Stack是两个完全没有任何关系的类...

ting2267的博客 796

C#系列之静态成员

C#系列之静态成员的相关内容。

2303_76354097的博客 1398

c#静态成员

      类的静态成员,例如静态属性和字段,静态方法,静态构造函数。       静态成员可以在类的实例之间共享,所以也叫共享成员。静态属性和静态字段可以访问独立于任何对象实例的数据,静态方法可以执行与对象类相关,与对象实例无关的命令。使用静态成员,不需实例化对象。class Class1    {        static int value=0;       

PaulEAfly的专栏 1404

c# 静态类,静态成员

静态静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类的变量。在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例化该静态类;其次,它防止在类的内部声明任何实例字段或方法。 静态类是自C# 2.0才引入的,C# 1.0不支持静态类声明。在这之前程序员必须声明一个私有构造器,私有构造器禁止开发者...

qq_37672438的博客 435

C#学习之静态成员和非静态成员构造函数,方法,方法参数,操作符重载,事件

静态成员和非静态成员:若将类中的某个成员声明为static,该成员称为静态成员。类中的成员要么是静态,要么是非静态。一般说来,静态成员是属于类所有的,非静态成员则属于类的实例-对象。类的非静态成员属于类的实例所有,每创建一个类的实例,都在内存中为非静态成员开辟了一块区域。而类的静态成员属于类所有,为这个类的所有实例共享。无论创建了多少个副本,一个静态成员字内存中只占有一块区域。构造函数:使用构

pughua的专栏 1081

C#避免在泛型类中声明静态成员

在上一建议中,已经理解了应该将MyList和MyList视作两个完全不同的类,所以,不应该将MyList中的静态成员理解成MyList和MyList共有的成员。 class MyList { public static int Count { get; set; } public MyList() { Count++; } } stati

博客 3387

C# 静态成员的初始化

引言,在学习

yuyanfei125的专栏 3379

C#基础——类、构造函数静态成员

类是一个数据类的蓝图。构成类的方法和变量称为类的成员,对象是类的实例。类的定义规定了类的对象由什么组成及在这个对象上可执行什么操作。访问属性:public(公有的,类中可以直接访问) ,protected受保护的 , private私有的(默认的)(私有的,其他的类中不可以直接访问)如下类的示例,描述Box的信息(属性(成员变量)和Box的方法(函数))

wacanda的博客 572
上一篇: 告诉你宇宙的真相:现代观点
下一篇: .NET 程序员面试题(持续更新)至少100多公司使用过的面试题[经典中的经典]
zfrong
博客等级 码龄19年 7122粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值