如何为C#自动属性设置默认值?

时间:2020-03-05 18:46:46  来源:igfitidea点击:

如何给CAuto-Property提供默认值?我或者使用构造函数,或者恢复为旧语法。

使用构造函数:

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

使用常规属性语法(具有默认值)

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

有没有更好的办法?

解决方案

回答

我们是否尝试过将DefaultValueAttribute或者ShouldSerialize和Reset方法与构造函数结合使用?我觉得如果要创建一个可能显示在设计器表面或者属性网格中的类,则必须使用这两种方法之一。

回答

在C5和更早版本中,要为自动实现的属性提供默认值,我们必须在构造函数中执行此操作。

自C6.0起,具有自动属性初始化器的功能。语法为:

public int X { get; set; } = x; // C# 6 or higher

回答

DefaultValueAttribute仅在vs设计器中工作。它不会将属性初始化为该值。

请参见DefaultValue属性不适用于我的自动属性

回答

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

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

        set { _name = value; } 
    }
}

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

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

希望对我们有所帮助!

回答

就个人而言,如果我们不打算执行除自动属性之外的任何操作,那么根本就不会将其设置为属性。只需将其保留为字段即可。这些物品的封装好处只是红色鲱鱼,因为它们后面没有东西要封装。如果我们需要更改基础实现,则仍然可以随意将它们重构为属性,而无需破坏任何相关代码。

嗯...也许这以后会成为自己的问题

回答

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

我认为这种语法是Cup至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"

回答

在C6及更高版本中,我们可以简单地使用以下语法:

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

注意,要拥有readonly属性,只需忽略该设置即可,如下所示:

public object Foo { get; } = bar;

我们还可以从构造函数中分配" readonly"自动属性。

在此之前,我回应如下。

我会避免向构造函数添加默认值;将其留给动态分配,并避免在两个位置分配变量(即类型为default且在构造函数中)。通常,在这种情况下,我只会写一个普通属性。

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

http://msdn.microsoft.com/zh-CN/library/system.componentmodel.defaultvalueattribute.aspx

回答

完整样本很少:

using System.ComponentModel;

private bool bShowGroup ;
[Description("Show the group table"), Category("Sea"),DefaultValue(true)]
public bool ShowGroup
{
    get { return bShowGroup; }
    set { bShowGroup = value; }
}