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

静态构造函数是在构造函数方法前面添加了static关键字之后形成的,并且没有修饰符(public,private),没有参数。

特点:

1、静态构造函数没有修饰符修饰(public,private),因为静态构造函数不是我们程序员调用的,是由.net 框架在合适的时机调用的。
2、静态构造函数没有参数,因为框架不可能知道我们需要在函数中添加什么参数,所以规定不能使用参数。
3、静态构造函数前面必须是static 关键字。如果不加这个关键字,那就是普通的构造函数了。
4、静态构造函数中不能实例化实例变量。(变量可以分为类级别和实例级别的变量,其中类级别的有static关键字修饰)。
5、静态函数的调用时机,是在类被实例化或者静态成员被调用的时候进行调用,并且是由.net框架来调用静态构造函数来初始化静态成员变量。
6、一个类中只能有一个静态构造函数
7、无参数的静态构造函数和无参数的构造函数是可以并存的。因为他们一个属于类级别,一个属于实例级别,并不冲突。
8、静态构造函数只会被执行一次。并且是在特点5中的调用时机中进行调用。
9、如果没有在类中写构造函数,那么框架会为我们生成一个构造函数,那么如果我们在类中定义了静态变量,但是又没有定义静态构造函数,那么框架也会帮助我们来生成一个静态构造函数来让框架自身来调用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class A
    {
        static A()
        {
            Console.WriteLine("1");
        }
        public A()
        {
            Console.WriteLine("2");

        }
    }
    class B:A
    {
        static B()
        {
            Console.WriteLine("a");
        }
        public B()
        {
            Console.WriteLine("b");

        }
    }
    class Program
    {
        static void Main(string[] args)
        {
           //a 1 2 b
            A ab = new B();
            Console.WriteLine("--------");
            //2 b
            ab = new B();
            Console.ReadKey();
        }
    }
}

执行结果:这里写图片描述

1、A ab = new B();

A. 实例化B, 执行B的静态构造函数 == 输出`a`
B. 执行B的构造函数,因为B继承自A,所以先进入A
C. 实例化A,  执行A的静态构造函数,== 输出 `1`
D. 执行A的构造函数 ==输出`2`
E. 最后回到B的构造函数 == 输出`b`

2、ab = new B();

    因为静态构造函数只创建一次,所以不会进入静态构造函数
    A. 因为B继承自A,所以先进入A的构造函数 == 输出`2`
    B. 再进入B的构造函数 == 输出`b`
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值