C#构造函数声明

C#构造函数声明,c#,constructor,C#,Constructor,由于我对构造器主题还不熟悉,我对我们为什么要使用它有点困惑?声明构造函数和不声明构造函数有什么区别吗?构造函数用于初始化类对象。如果您没有声明/定义它,那么将为您创建一个默认构造函数 如果不声明任何构造函数,编译器将生成不带参数的默认构造函数 以这一类为例: public Class X { public int A { get; set; } } 其中没有构造函数声明,因此编译器将在该类中放置默认构造函数,如下所示: public Class X { public int A

由于我对构造器主题还不熟悉,我对我们为什么要使用它有点困惑?声明构造函数和不声明构造函数有什么区别吗?

构造函数用于初始化类对象。如果您没有声明/定义它,那么将为您创建一个默认构造函数

如果不声明任何构造函数,编译器将生成不带参数的默认构造函数

以这一类为例:

public Class X
{
    public int A { get; set; }
}
其中没有构造函数声明,因此编译器将在该类中放置默认构造函数,如下所示:

public Class X
{
    public int A { get; set; }

    public X () 
    { 
    }

}
X obj = new X();
如果在类中声明构造函数,则不会生成默认构造函数

public Class X
{
    public int A { get; set; }

    public X (int a) 
    { 
          // do something
    }

}
在此示例中,将不会生成默认的空构造函数。 如果尝试创建这样的实例:

public Class X
{
    public int A { get; set; }

    public X () 
    { 
    }

}
X obj = new X();
它将生成编译错误

更多详情:,

声明一个只调用基类的公共无参数构造函数的公共无参数构造函数没有区别:

public class Test
{
    public Test() : base() {}
}
相当于:

public class Test
{
}
编译器为您提供一个默认构造函数

(并且
base()
部分是隐式的;如果您没有显式地链接到另一个构造函数,编译器会将其视为您试图链接到无参数基类构造函数1。)

但这并不意味着构造函数是无用的。。。你通常会把代码放在那里。通常,它会复制以下参数:

public class Test
{
    private readonly string name;

    public Test(string name)
    {
        this.name = name;
    }
}
。。。但是构造函数可以包含与普通方法相同的代码。值得注意的是,在构造函数运行时,对象可能尚未完全初始化,因为派生类的构造函数体尚未执行。因此,建议不要在构造函数中调用虚拟方法

实例构造函数的一般细节见C#5规范第10.11节,默认构造函数的细节见第10.11.4节



1更具体地说,它将链接起来,就像您编写了
base()
。如果没有无参数构造函数,但有一个构造函数的参数都是可选的,那么将调用该构造函数。

构造函数用于类的许多事情

  • 如果您想对类的实例进行初始化

     public class MyClass
     {
         private string myWork = string.Empty;
         public MyClass()
         {
             myWork = "Started";
         }
      }
    
  • 如果要限制类的对象创建范围

    public class MyClass
    {
        private string myWork = string.Empty;
        protected MyClass() 
        {
            myWork = "Started";
        }
    }
    
  • 还有很多其他的东西,比如基类支持和其他。请也在MSDN上搜索