C#静态构造函数用法实例分析
作者:xtechnet 时间:2022-03-18 10:32:34
本文实例讲述了C#静态构造函数用法。分享给大家供大家参考。具体如下:
当我们想初始化一些静态变量的时候,就需要用到静态构造函数了。这个静态构造函数属于类,而不属于实例,就是说这个构造函数只会被执行一次,即:在创建第一个实例或引用任何静态成员之前,由.NET自动调用。
现在碰到这样一个场景:提供一个静态方法,这个静态方法在不同的地方使用,涉及到一个参数值不同,而其他内容都完全一致。如果是将静态方法的内容复制出来做成另外一个方法,代码冗余太多,做法不可取。使用静态构造函数处理静态变量,则可以尽最大程度简化代码。如下示例:
/// <summary>
/// 基类
/// </summary>
public class A
{
public static string Field = "original-test";
//静态构造函数
static A()
{
Field = "test-a";
}
public static void Test()
{
Console.WriteLine("the output is : " + Field);
}
}
/// <summary>
/// 子类
/// </summary>
public class B : A
{
//静态构造函数
static B()
{
Field = "test-b";
}
public static new void Test()
{
A.Test();
//调用基类方法,这个对基类Test函数的覆盖很重要,没有这个,那么调用B.Test()的时候其实是调用基类的Test方法。
}
}
如代码所示,类型B继承于基类型A。B中的静态构造函数对静态变量Field进行赋值,这个会在调用子类中的Test方法之前调用,而B中Test方法的实现则是完全调用基类A的Test方法,这样,在方法执行的时候,方法中使用的静态变量Field的值就是在B的静态构造函数中赋值之后的test-b。
调用结果如下:
static void Main(string[] args)
{
A.Test();//输出the output is : test-a
B.Test();//输出the output is : test-b
Console.ReadLine();
}
A.Test()调用,Field值为test-a;而B.Test()调用,Field值为test-b。
这样,当静态方法的实现逻辑复杂的时候,就可以针对需要将这个方法进行个性化实现的需求的时候简化代码:子类在静态构造函数中对静态变量重新赋值,然后重新实现基类中的静态方法。
(注意,后面的重新实现基类中的静态方法是必须的,否则输出B.Test()的时候,调用基类的Test()方法,使用的Field变量则是基类中的变量,那时输出则变成如下:)
static void Main(string[] args)
{
A.Test();//输出the output is : test-a
B.Test();//输出the output is : test-a。
//因为没有覆盖子类方法,等同于A.Test()
Console.ReadLine();
}
希望本文所述对大家的C#程序设计有所帮助。
标签:C#,静态,构造函数
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Sentinel源码解析入口类和SlotChain构建过程详解
2022-06-14 18:29:50
![](https://img.aspxhome.com/file/2023/2/105972_0s.png)
C#使用smtp发送带附件的邮件实现方法
2022-11-03 17:53:39
Android使用GPS获取用户地理位置并监听位置变化的方法
2022-03-29 14:24:17
![](https://img.aspxhome.com/file/2023/8/92628_0s.png)
C# 修改文件的创建、修改和访问时间的示例
2023-06-09 23:18:50
Android带进度的圆形进度条
2023-08-05 21:47:18
![](https://img.aspxhome.com/file/2023/8/86748_0s.jpg)
springboot 正确的在异步线程中使用request的示例代码
2023-11-24 22:36:13
![](https://img.aspxhome.com/file/2023/6/59386_0s.jpg)
一文带你了解SpringBoot的启动原理
2023-11-28 20:44:42
spring cloud整合ribbon问题及解决方案
2023-07-25 04:24:49
![](https://img.aspxhome.com/file/2023/3/57823_0s.png)
Java 中的 xx ≠ null 是什么新语法
2022-09-10 20:51:13
![](https://img.aspxhome.com/file/2023/1/78901_0s.png)
java list,set,map,数组间的相互转换详解
2023-04-11 13:02:04
C#实现的文件上传下载工具类完整实例【上传文件自动命名】
2023-03-05 17:39:38
Spring定时任务中@PostConstruct被多次执行异常的分析与解决
2022-08-20 07:28:22
Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】
2021-07-07 21:11:57
Android Build类的详解及简单实例
2023-07-02 21:12:45
基于C#的图表控件库 ScottPlot编译visual studio 2022
2022-05-02 10:24:13
![](https://img.aspxhome.com/file/2023/2/96382_0s.jpg)
Java C++实现相同MD5加密算法的方式
2023-10-12 12:26:02
![](https://img.aspxhome.com/file/2023/5/58685_0s.jpg)
C#绘制时钟的方法
2021-08-25 15:18:12
![](https://img.aspxhome.com/file/2023/0/91240_0s.jpg)
java使用stream判断两个list元素的属性并输出方式
2023-02-06 14:15:18
Apache Commons fileUpload文件上传多个示例分享
2021-11-13 07:23:51
springboot相关面试题汇总详解
2023-10-06 17:16:11