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();
}
时间: 2024-12-19 21:00:56

C# 静态构造函数使用的相关文章

cs——静态构造函数

定义如下测试类 public class Test { public static int msA = 10; static Test() { System.Console.WriteLine(string.Format("msA0:{0}", msA)); msA = msA + msA; System.Console.WriteLine(string.Format("msA1:{0}", msA)); } public Test() { msA = 30; Sy

关于C#的静态类和静态构造函数

静态构造函数是C#的一个新特性,其实好像很少用到.不过当我们想初始化一些静态变量的时候就需要用到它了.这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次.也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用. class SimpleClass { // Static constructor static SimpleClass() { // } } 在使用静态构造函数的时候应该注意几点: 1.静态构造函数既没有访问修饰符,也没有参数.因为是.NET调用的

C#静态构造函数

静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作.在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数. 静态构造函数具有以下特点: 静态构造函数既没有访问修饰符,也没有参数. 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类. 无法直接调用静态构造函数. 在程序中,用户无法控制何时执行静态构造函数. 静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项. 静态构造函数在为非托管代码创建包装类时也很有用,此时该构

C# 静态构造函数的使用

class StaticClass { public static string Name { get; set; } static StaticClass() { Name = "Delphi"; } public StaticClass() { Console.WriteLine("Default constructor"); } public static void Test() { Console.WriteLine("hello,wrold&qu

静态构造函数

先看一道常见题目,以下代码的执行结果是什么? class A { public static int X = B.Y + 1; static void Main(string[] args) { Console.WriteLine(X); } } class B { public static int Z = 10; public static int Y; static B() { Console.WriteLine(Z); Y = A.X + 1; } } 一.定义 由名称可知,静态构造函数

c#静态构造函数 与 构造函数 你是否还记得?

构造函数这个概念,在我们刚开始学习编程语言的时候,就被老师一遍一遍的教着.亲,现在你还记得静态构造函数的适用场景吗?如果没有,那么我们一起来复习一下吧. 静态构造函数是在构造函数方法前面添加了static关键字之后形成的,并且没有修饰符(public,private),没有参数. 静态构造函数有哪些特点呢: 静态构造函数没有修饰符修饰(public,private),因为静态构造函数不是我们程序员调用的,是由.net 框架在合适的时机调用的. 静态构造函数没有参数,因为框架不可能知道我们需要在函

C# static 静态构造函数

static   静态构造函数, 1.用于对静态数据的初始化 2.前面不能有参数不能有修饰符,不能被调用 3.当类被加载时,类的静态构造函数自动被调用,最多只执行一次 class Program     {         private static int count = 0;         static Program()         {             Console.WriteLine("我是静态构造函数,我被加载了!");             count+

C#静态构造函数和非静态构造函数

// 使用静态构造函数时,需要注意几点 //1. 一个类中,最多只能有一个静态构造函数,不允许静态构造函数的重载: //2. 不能加任何访问修饰符(public/private/internale等),且不能带有任何参数: //3. 不管创建该类的多少实例,该函数值调用一次: //4. 运行时环境在创建第一个实例时或者在调用任何静态成员之前调用静态构造函数: //5. 它先于任何实例构造函数被调用: public static int Number; static Student() { Num

子类如果不实例化则不会调用它自身的静态构造函数

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication6 { class Program { static void Main(string[] args) { #region 如果注释掉, 则Stat2.Instance为null 报错 Stat1.DoSth(); Stat2 st2 = new Stat2(); #en