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#,静态,构造函数
0
投稿

猜你喜欢

  • maven继承父工程统一版本号的实现

    2023-01-27 09:19:49
  • SpringMVC实现表单验证功能详解

    2023-09-24 09:07:28
  • springboot整合mybatis将sql打印到日志的实例详解

    2022-06-15 00:56:06
  • winform绑定快捷键的方法

    2023-12-10 22:16:04
  • SpringBoot整合Redis正确的实现分布式锁的示例代码

    2023-05-05 14:59:58
  • Android Vibrator调节震动代码实例

    2022-07-06 04:56:46
  • Java如何生成4位、6位随机数短信验证码(高效实现)

    2023-01-24 18:05:20
  • 解决nacos升级spring cloud 2020.0无法使用bootstrap.yml的问题

    2021-12-02 19:44:29
  • 深入理解Javascript中的this关键字

    2022-03-08 16:52:25
  • java中文传值乱码问题的解决方法

    2023-11-25 16:26:47
  • Spring+SpringMVC+MyBatis深入学习及搭建(一)之MyBatis的基础知识

    2021-09-27 15:12:59
  • windows下jar包开机自动重启的步骤

    2022-10-17 22:21:41
  • SpringBoot整合Elasticsearch并实现CRUD操作

    2021-10-28 07:27:31
  • CentOS安装jdk的三种方法

    2022-01-13 06:24:41
  • C#访问C++动态分配的数组指针(实例讲解)

    2021-08-20 10:34:27
  • java中重载,继承,重写和多态的区别

    2022-05-06 06:40:16
  • Android自定义滑动解锁控件使用详解

    2022-08-20 05:36:38
  • Spring-data-redis操作redis cluster的示例代码

    2022-12-17 17:04:00
  • 使用Spring Cache设置缓存条件操作

    2023-01-25 16:38:06
  • c#访问this关键字和base关键字示例

    2021-09-28 23:36:14
  • asp之家 软件编程 m.aspxhome.com