c#构造函数链接/默认构造函数

c#构造函数链接/默认构造函数,c#,class,constructor,chaining,C#,Class,Constructor,Chaining,我是编程新手,我想知道在代码中用C#声明默认构造函数是否是最佳实践,尽管我认为C#会为您这样做。例如,下面没有语句的开放构造函数的用途是什么。 下面的例子是我一直在关注的东西,但我真的不明白为什么OperationResult的两个构造函数类是链接的?为什么需要空的那一个 public class OperationResult<T> { public OperationResult() { } public OperationResult(T re

我是编程新手,我想知道在代码中用C#声明默认构造函数是否是最佳实践,尽管我认为C#会为您这样做。例如,下面没有语句的开放构造函数的用途是什么。 下面的例子是我一直在关注的东西,但我真的不明白为什么OperationResult的两个构造函数类是链接的?为什么需要空的那一个

public class OperationResult<T>
{
    public OperationResult()
    {
    }

    public OperationResult(T result, string message) : this()
    {
        this.Result = result;
        this.Message = message;
    }

    public T Result { get; set; }
    public string Message { get; set; }
}
公共类操作结果
{
公共运营结果()
{
}
公共操作结果(T结果,字符串消息):this()
{
结果=结果;
this.Message=消息;
}
公共T结果{get;set;}
公共字符串消息{get;set;}
}

}

如果不声明任何构造函数,C#将假定默认构造函数不带参数。因此,如果您不需要构造函数的任何重载,也不需要在创建类的新实例时编写代码,则不需要声明构造函数。但是,如果您有构造函数的重载(如果您使用参数声明构造函数),则除非您显式声明,否则没有参数的构造函数将不可用。如果你不需要任何代码,它就像你在例子中提到的空构造函数一样。

在你的例子中,你不需要链接它们。但是,如果要使用对象初始值设定项,则需要使用无参数构造函数:

var result=newoperationresult{Message=“Hello world”};
当您设置了公共
属性时,它也很有用

当您有将在构造函数中重复的逻辑时,或者当您有基本初始化时,链接构造函数非常有用

例如,考虑一下,我们有以下内容:

公共密封类MyClass{
公共MyClass(){
标签=新列表();
}
公共MyClass(字符串用户名):this()
{
if(string.IsNullOrWhiteSpace(用户名))
抛出新ArgumentNullException(nameof(username));
用户名=用户名;
}
公共字符串用户名{get;set;}
公共列表标记{get;set;}
}
这里我们有一个标识为
标记的列表
,它是用一个没有参数的构造函数初始化的

如果调用
MyClass(字符串用户名)
而不包含
:this()
,则不会触发基本构造函数,并且标识为
标记的列表将使用默认值
null
初始化

如果我们试图对
标记执行某种操作
,将引发异常,例如,
NullReferenceException

例如,如果我们想执行一个操作,比如通过索引获取或调用LINQ方法,等等,该怎么办?由于
列表
尚未初始化,因此可以假定任何类型

考虑到这一点,一些第三方库需要无参数构造函数

例如,让我们探索Newtonsoft Json。如果我们不提供无参数构造函数和具有
[JsonConstructor]
属性的构造函数,反序列化将抛出错误


我不确定实体框架是否是这种情况,但通常情况下,如果您只需要一个无参数构造函数用于此目的,那么您将设置它
private

实际上不需要声明两个构造函数,直到&除非您想将其用于特定目的。如果您想将所有变量初始化为某个值,可以将其写入构造函数中

MyClass
{
整数和;
公共MyClass()
{
总和=0;
}
}
现在何时使用参数化构造函数?

假设您希望使用某些指定的配置初始化对象,或者假设您希望使用构造函数的依赖项注入。

C#仅在您不声明任何其他构造函数的情况下才会为您这样做。