微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决C#构造函数链接/默认构造函数

编程新手,我想知道最好的做法是在代码中用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; }
}

}

解决方法

如果不声明任何构造函数,则C#将假定默认构造函数不带参数。因此,如果构造函数不需要任何重载,并且在创建类的新实例时也不需要编写代码,则无需声明构造函数。但是,如果构造函数有重载(如果使用参数声明了构造函数),则没有参数的构造函数将不可用,除非您明确声明。而且如果您不需要任何代码,那就像您在示例中提到的空构造函数。

,

在您的情况下,您不需要链接它们。但是如果要使用对象初始化程序,则需要无参数构造函数:

var result = new OperationResult {Message = "Hello world"};

当您拥有公共set属性时,这很有用。 当您具有将在构造函数中重复的逻辑或以基本初始化为例时,将构造函数链接起来很好,请考虑您拥有下一个类

public sealed class MyClass {
    public MyClass() {
         Tags = new List<string>();
    }

    public MyClass(string username) : this()
    {
        if(string.IsNullOrWhiteSpace(username))
            throw new ArgumentNullException(nameof(username));

        Username = username;
    }

    public string Username {get; set;}
   
    public List<string> Tags {get;set;}
}

出现了Tags的列表,并在无参数构造函数中对其进行了初始化。而且,如果您在调用: this()时删除了MyClass(string username),基本构造函数将不会触发,并且Tags的集合将使用默认值null进行初始化。因此,如果您将在代码中使用此代码,则在尝试使用NullReferenceException进行某些操作时可能会抛出Tags:通过索引获取,调用linq方法等。您可以使用任何类型来代替{{ 1}},需要初始化。

同时,一些第三方库出于其目的需要无参数构造函数,例如Newtonsoft Json(如果不提供无参数构造函数和具有List<string>属性的构造函数,则反序列化将引发错误),实体框架(不确定大约是100%),等等。通常,如果您仅出于此目的而需要无参数构造函数,则可以将其标记为[JsonConstructor]

,

除非您要出于特定目的使用它,否则实际上不需要在&之前声明两个构造函数。如果要将所有变量初始化为某个值,可以在构造函数中编写。

例如。

MyClass
{
    int sum;
    public MyClass()
    {
        sum = 0;
    }
}

现在何时使用参数化构造函数?

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。