当创建 class 的实例时,使用默认值的 init class 属性 有什么更好的方法
What way is better for init class property with default value when the create the instance of class
我有以下简单的class:
public class SimpleClass{
public int SimpleProperty {get; set;}
public SimpleClass(){
}
}
我需要在创建 SimpleClass 实例时将 属性 SimpleProperty 初始化为默认值。
这样做的最好方法是什么?
在构造函数中创建参数并在创建Simple实例时传递默认值Class:
public class SimpleClass{
public int SimpleProperty {get; set;}
public SimpleClass(int simpleProperty){
SimpleProperty = simpleProperty;
}
}
或在默认构造函数中初始化属性:
public class SimpleClass{
public int SimpleProperty {get; set;}
public SimpleClass(){
SimpleProperty = 0; //the example of default value
}
}
这是两种不同的方法。如果您有默认值,您通常可以 省略 为这个 属性 设置一个值。因此,您应该在构造函数中初始化默认值。
var a new SimpleClass();
现在 a
具有您在构造函数中提供的默认值。
具有期望参数的签名,另一方面强制用户提供一个值。这意味着根本没有默认值,您不能省略该值。
var a = SimpleClass(); // this won´t compile
顺便说一下,您忘记了第三种方法:可选参数:
SimpleClass(int value = -1)
{
SimpleProperty = value;
}
现在你可以把它作为我的第一个方法
var a = new SomeSimpleClass()
或
var a = new SimpleClass(1)
从 C#6 开始,事情变得更容易了,因为您可以给 属性 一个默认值:
int SimpleProperty { get; set; } = -1;
无论如何,如果您的默认值只是零,您可以完全省略它,因为零是 int
.
的默认值
您可以有多个构造函数。所以你实际上可以同时使用两者。
因此,如果用户没有提供值,则默认设置为 0。
好吧,这在很大程度上取决于您正在处理的项目。
如果它是大型企业项目,并且您的 属性 是某种对象类型(这使您的 class 依赖于其他对象),第一个选项会更可取,因为它允许使用 IoC 容器和框架,它还简化了单元测试的编写方式,因为在 ctor 内部传递模拟值很简单,如果 ctor 不接受参数,就没那么简单了。
对于简单的类型,例如 int
或在一个简单的宠物项目中,但这并不重要,由您决定。不要忘记,您可以为 ctor 使用 optional 参数:
public SimpleClass(int simpleProperty = 15)
{
SimpleProperty = simpleProperty;
}
同时考虑使 class 不可变:
public class SimpleClass
{
// getter only, no setter
public int SimpleProperty { get; }
public SimpleClass(int simpleProperty)
{
// allowed in C#6+
SimpleProperty = simpleProperty;
}
}
如果您的属性是可写的(即 class 是可变的),则构造函数重载不会真正阻止您搬起石头砸自己的脚。
我有以下简单的class:
public class SimpleClass{
public int SimpleProperty {get; set;}
public SimpleClass(){
}
}
我需要在创建 SimpleClass 实例时将 属性 SimpleProperty 初始化为默认值。 这样做的最好方法是什么?
在构造函数中创建参数并在创建Simple实例时传递默认值Class:
public class SimpleClass{ public int SimpleProperty {get; set;} public SimpleClass(int simpleProperty){ SimpleProperty = simpleProperty; } }
或在默认构造函数中初始化属性:
public class SimpleClass{ public int SimpleProperty {get; set;} public SimpleClass(){ SimpleProperty = 0; //the example of default value } }
这是两种不同的方法。如果您有默认值,您通常可以 省略 为这个 属性 设置一个值。因此,您应该在构造函数中初始化默认值。
var a new SimpleClass();
现在 a
具有您在构造函数中提供的默认值。
具有期望参数的签名,另一方面强制用户提供一个值。这意味着根本没有默认值,您不能省略该值。
var a = SimpleClass(); // this won´t compile
顺便说一下,您忘记了第三种方法:可选参数:
SimpleClass(int value = -1)
{
SimpleProperty = value;
}
现在你可以把它作为我的第一个方法
var a = new SomeSimpleClass()
或
var a = new SimpleClass(1)
从 C#6 开始,事情变得更容易了,因为您可以给 属性 一个默认值:
int SimpleProperty { get; set; } = -1;
无论如何,如果您的默认值只是零,您可以完全省略它,因为零是 int
.
您可以有多个构造函数。所以你实际上可以同时使用两者。
因此,如果用户没有提供值,则默认设置为 0。
好吧,这在很大程度上取决于您正在处理的项目。
如果它是大型企业项目,并且您的 属性 是某种对象类型(这使您的 class 依赖于其他对象),第一个选项会更可取,因为它允许使用 IoC 容器和框架,它还简化了单元测试的编写方式,因为在 ctor 内部传递模拟值很简单,如果 ctor 不接受参数,就没那么简单了。
对于简单的类型,例如 int
或在一个简单的宠物项目中,但这并不重要,由您决定。不要忘记,您可以为 ctor 使用 optional 参数:
public SimpleClass(int simpleProperty = 15)
{
SimpleProperty = simpleProperty;
}
同时考虑使 class 不可变:
public class SimpleClass
{
// getter only, no setter
public int SimpleProperty { get; }
public SimpleClass(int simpleProperty)
{
// allowed in C#6+
SimpleProperty = simpleProperty;
}
}
如果您的属性是可写的(即 class 是可变的),则构造函数重载不会真正阻止您搬起石头砸自己的脚。