如何给C#自动属性一个初始值?

我要么使用构造函数,要么恢复到旧语法。

使用构造函数:

class Person 
{
    public Person()
    {
        Name = "Initial Name";
    }
    public string Name { get; set; }
}

使用普通属性语法(具有初始值)

private string name = "Initial Name";
public string Name 
{
    get 
    {
        return name;
    }
    set
    {
        name = value;
    }
}

有更好的方法吗?


当前回答

有时,如果我不希望它被实际设置并保存在我的数据库中,我会使用它:

class Person
{
    private string _name; 
    public string Name 
    { 
        get 
        {
            return string.IsNullOrEmpty(_name) ? "Default Name" : _name;
        } 

        set { _name = value; } 
    }
}

显然,如果它不是一个字符串,那么我可能会使对象可以为null(double?,int?),并检查它是否为null,返回默认值,或返回它设置的值。

然后,在保存之前,我可以在存储库中进行检查,看看它是否是我的默认值,并且不存在,或者进行后门检查,查看备份值的真实状态。

其他回答

使用构造函数是因为“当构造函数完成时,构造应该完成”。财产类似于类的状态,如果必须初始化默认状态,可以在构造函数中进行初始化。

为了澄清,是的,您需要在构造函数中为类派生对象设置默认值。您需要确保构造函数在使用时具有正确的访问修饰符。如果对象未实例化,例如它没有构造函数(例如静态方法),则可以通过字段设置默认值。这里的理由是,对象本身将只创建一次,而不实例化它。

@达伦·科普(Darren Kopp)-回答不错,干净利落,正确无误。重申一下,您可以为抽象方法编写构造函数。您只需在编写构造函数时从基类访问它们:

基类构造函数:

public BaseClassAbstract()
{
    this.PropertyName = "Default Name";
}

派生/具体/子类的构造函数:

public SubClass() : base() { }

这里的重点是,从基类中提取的实例变量可能会隐藏您的基字段名。使用“this.”设置当前实例化的对象值将允许您根据当前实例和所需的权限级别(访问修饰符)正确形成对象。

在C#9.0中添加了对init关键字的支持,这是一种非常有用且非常复杂的声明只读自动属性的方法:

声明:

class Person 
{ 
    public string Name { get; init; } = "Anonymous user";
}

~享受~使用:

// 1. Person with default name
var anonymous = new Person();
Console.WriteLine($"Hello, {anonymous.Name}!");
// > Hello, Anonymous user!


// 2. Person with assigned value
var me = new Person { Name = "@codez0mb1e"};
Console.WriteLine($"Hello, {me.Name}!");
// > Hello, @codez0mb1e!


// 3. Attempt to re-assignment Name
me.Name = "My fake"; 
// > Compilation error: Init-only property can only be assigned in an object initializer

在C#6及以上版本中,您可以简单地使用语法:

public object Foo { get; set; } = bar;

请注意,要具有只读属性,只需省略集合,如下所示:

public object Foo { get; } = bar;

您还可以从构造函数中指定只读自动属性。

在此之前,我的回答如下。

我会避免在构造函数中添加默认值;将其留给动态赋值,并避免在变量赋值的两个点(即默认类型和构造函数中)。在这种情况下,我通常只写一个普通属性。

另一个选项是执行ASP.Net的操作,并通过属性定义默认值:

http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx

当内联变量的初始值时,无论如何都会在构造函数中隐式完成。

我认为这种语法是C#中的最佳实践,最高可达5:

class Person 
{
    public Person()
    {
        //do anything before variable assignment

        //assign initial values
        Name = "Default Name";

        //do anything after variable assignment
    }
    public string Name { get; set; }
}

因为这样可以清楚地控制分配的顺序值。

从C#6开始,有一种新的方式:

public string Name { get; set; } = "Default Name";