当创建 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 初始化为默认值。 这样做的最好方法是什么?

  1. 在构造函数中创建参数并在创建Simple实例时传递默认值Class:

    public class SimpleClass{
        public int SimpleProperty {get; set;}
    
        public SimpleClass(int simpleProperty){
            SimpleProperty = simpleProperty;
        }
    }
    
  2. 或在默认构造函数中初始化属性:

    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 是可变的),则构造函数重载不会真正阻止您搬起石头砸自己的脚。