• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#构造函数、私有构造函数、静态构造函数与构造函数执行顺序 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

https://www.cnblogs.com/ArtofDesign/p/3603986.html

 默认构造函数,如果没有为类指定任何构造函数,编译器会自动为类创建一个无参构造函数,用以初始化类的字段;如果为类编写了构造函数,那么编译器就不会再自动生成无参构造函数了。ps.C#不允许用户为结构定义无参构造函数。

 

    静态构造函数,不能访问实例成员,只能用来初始化一些静态字段或者属性,仅在第一次调用类的任何成员时自动执行,不带访问修饰符,不带任何参数,每个类只能有一个静态构造函数,但可以同时还有一个无参实例构造函数,如下。

public class Demo
{
    static Demo() { }
    public Demo() { }
}

   

    私有构造函数,将构造函数申明为私有的,则不能通过new运算符在外部代码中实例化(但可以编写一个静态方法或属性在其内部实例化一个对象,再将结果返回给外部代码)。私有构造函数的作用:

  • 永远不会实例化,因为它仅用作某些静态成员的容器
  • 希望类只能通过调用某个静态方法来实例化(即所谓的对象实例化的类工厂方法)
    public class Demo
    {
        private Demo() { }
        public static Demo NewDemo()
        {
            return new Demo();
        }
    }

 

    构造函数执行顺序,通常情况下:构造函数先调用System.Object的构造函数,再按照继承的层次结构从上往下进行,直到最终要实例化的类为止,即最先调用的是基类的构造函数,但如果类有静态构造函数,且为首次调用该类,则先调用的是子类的静态构造函数,再是父类的静态构造函数,当然静态构造函数只会执行这一次,如下

//父类
public class SuperClass
{
    static SuperClass() 
    {
        Console.WriteLine("Super.Static");
    }
    public SuperClass() 
    {
        Console.WriteLine("Super.Instance");
    }
}

//子类
public class ChildClass : SuperClass
{
    static ChildClass() 
    {
        Console.WriteLine("Child.Static");
    }
    public ChildClass() 
    {
        Console.WriteLine("Child.Instance");
    }
}

//客户程序
class Program
{
    static void Main(string[] args)
    {
        ChildClass cc = new ChildClass();
        Console.ReadKey();
    }
}

输出结果为:

Child.Static

Super.Static

Super.Instance

Child.Instance

 

    在不考了静态构造函数的情况下(因为静态构造仅执行一次,且定义静态构造函数的时候并不多),子类在调用父类的构造函数时,默认情况是调用父类的无参构造函数,如果父类只有带参构造函数,而没有无参构造函数,那么编译时会报错;不过我们可以通过base关键字来指定调用带参构造函数,如下

//父类
public class SuperClass
{
    public SuperClass(string param)
    {
        Console.WriteLine("Super:" + param);
    }
}

//子类
public class ChildClass : SuperClass
{
    public ChildClass(string param):base(param)
    {
        Console.WriteLine("Child:" + param);
    }
}

//客户程序
class Program
{
    static void Main(string[] args)
    {
        ChildClass cc = new ChildClass("param");
        Console.ReadKey();
    }
}

输出结果为

Super:param

Child:param

public class SuperStaticConstructor
    {
        public SuperStaticConstructor()
        {
            Console.WriteLine("parent constructor");
        }

        static SuperStaticConstructor()
        {
            Console.WriteLine("parent static constructor");
        }
    }
    public class StaticConstructor: SuperStaticConstructor
    {
        public StaticConstructor()
        {
            Console.WriteLine("child constructor");
        }

        static StaticConstructor()
        {
            Console.WriteLine("child static constructor");
        }
    }

    public class StaticConstructorTest
    {
        public static void Run()
        {
            string[] strArray = new string[4]{ "a","b", "a", "b" };
            Parallel.ForEach(strArray, (item) =>
            {
                Console.WriteLine(item);
                new StaticConstructor();
            });
        }
    }

  StaticConstructorTest.Run();

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#模拟登录Facebook实现发送消息、评论帖子发布时间:2022-07-14
下一篇:
C#多线程系列之Mutex使用发布时间:2022-07-14
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap