爲C#自動屬性賦予初始值的最佳方法是什麼?

如何爲C#自動屬性賦予初始值? react

我要麼使用構造函數,要麼恢復爲舊語法。 函數

使用構造函數: this

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

使用常規屬性語法 (帶有初始值) spa

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

有沒有更好的辦法? .net


#1樓

爲了澄清,是的,您須要在構造函數中爲類派生對象設置默認值。 您將須要確保構造函數存在,而且帶有適當的訪問修飾符以進行構造(若是使用)。 若是對象沒有實例化,例如它沒有構造函數(例如靜態方法),則能夠經過該字段設置默認值。 這裏的理由是,對象自己將僅建立一次,而您無需實例化它。 code

@Darren Kopp-好的答案,乾淨並且正確。 重申一下,您能夠爲Abstract方法編寫構造函數。 編寫構造函數時,您只須要從基類訪問它們: 對象

基礎類的構造函數: blog

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

派生/混凝土/子類的構造函數: 繼承

public SubClass() : base() { }

這裏的重點是,從基類中提取的實例變量可能會掩埋您的基字段名稱。 使用「 this」設置當前實例化的對象值。 將容許您根據實例實例化當前實例和所需的權限級別(訪問修飾符),從而正確地造成您的對象。 vps


#2樓

個人解決方案是使用自定義屬性,該屬性經過常量或使用屬性類型初始化程序提供默認值屬性初始化。

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class InstanceAttribute : Attribute
{
    public bool IsConstructorCall { get; private set; }
    public object[] Values { get; private set; }
    public InstanceAttribute() : this(true) { }
    public InstanceAttribute(object value) : this(false, value) { }
    public InstanceAttribute(bool isConstructorCall, params object[] values)
    {
        IsConstructorCall = isConstructorCall;
        Values = values ?? new object[0];
    }
}

要使用此屬性,必須從特殊的基類初始化器繼承一個類或使用靜態幫助器方法:

public abstract class DefaultValueInitializer
{
    protected DefaultValueInitializer()
    {
        InitializeDefaultValues(this);
    }

    public static void InitializeDefaultValues(object obj)
    {
        var props = from prop in obj.GetType().GetProperties()
                    let attrs = prop.GetCustomAttributes(typeof(InstanceAttribute), false)
                    where attrs.Any()
                    select new { Property = prop, Attr = ((InstanceAttribute)attrs.First()) };
        foreach (var pair in props)
        {
            object value = !pair.Attr.IsConstructorCall && pair.Attr.Values.Length > 0
                            ? pair.Attr.Values[0]
                            : Activator.CreateInstance(pair.Property.PropertyType, pair.Attr.Values);
            pair.Property.SetValue(obj, value, null);
        }
    }
}

用法示例:

public class Simple : DefaultValueInitializer
{
    [Instance("StringValue")]
    public string StringValue { get; set; }
    [Instance]
    public List<string> Items { get; set; }
    [Instance(true, 3,4)]
    public Point Point { get; set; }
}

public static void Main(string[] args)
{
    var obj = new Simple
        {
            Items = {"Item1"}
        };
    Console.WriteLine(obj.Items[0]);
    Console.WriteLine(obj.Point);
    Console.WriteLine(obj.StringValue);
}

輸出:

Item1
(X=3,Y=4)
StringValue

#3樓

我認爲這樣作能夠爲SomeFlag提供默認值false。

private bool _SomeFlagSet = false;
public bool SomeFlag
{
    get
    {
        if (!_SomeFlagSet)
            SomeFlag = false;        

        return SomeFlag;
    }
    set
    {
        if (!_SomeFlagSet)
            _SomeFlagSet = true;

        SomeFlag = value;        
    }
}

#4樓

從C#6.0開始 ,咱們能夠將默認值分配給自動實現的屬性。

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

咱們還能夠建立只讀的自動實現的屬性,例如:

public string Name { get; } = "Some Name";

請參閱: C#6:第一個反應,用於自動實現的屬性的初始化程序-Jon Skeet


#5樓

public Class ClassName{
    public int PropName{get;set;}
    public ClassName{
        PropName=0;  //Default Value
    }
}
相關文章
相關標籤/搜索