如何解决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 举报,一经查实,本站将立刻删除。