如何爲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
爲了澄清,是的,您須要在構造函數中爲類派生對象設置默認值。 您將須要確保構造函數存在,而且帶有適當的訪問修飾符以進行構造(若是使用)。 若是對象沒有實例化,例如它沒有構造函數(例如靜態方法),則能夠經過該字段設置默認值。 這裏的理由是,對象自己將僅建立一次,而您無需實例化它。 code
@Darren Kopp-好的答案,乾淨並且正確。 重申一下,您能夠爲Abstract方法編寫構造函數。 編寫構造函數時,您只須要從基類訪問它們: 對象
基礎類的構造函數: blog
public BaseClassAbstract() { this.PropertyName = "Default Name"; }
派生/混凝土/子類的構造函數: 繼承
public SubClass() : base() { }
這裏的重點是,從基類中提取的實例變量可能會掩埋您的基字段名稱。 使用「 this」設置當前實例化的對象值。 將容許您根據實例實例化當前實例和所需的權限級別(訪問修飾符),從而正確地造成您的對象。 vps
個人解決方案是使用自定義屬性,該屬性經過常量或使用屬性類型初始化程序提供默認值屬性初始化。
[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
我認爲這樣作能夠爲SomeFlag提供默認值false。
private bool _SomeFlagSet = false; public bool SomeFlag { get { if (!_SomeFlagSet) SomeFlag = false; return SomeFlag; } set { if (!_SomeFlagSet) _SomeFlagSet = true; SomeFlag = value; } }
從C#6.0開始 ,咱們能夠將默認值分配給自動實現的屬性。
public string Name { get; set; } = "Some Name";
咱們還能夠建立只讀的自動實現的屬性,例如:
public string Name { get; } = "Some Name";
請參閱: C#6:第一個反應,用於自動實現的屬性的初始化程序-Jon Skeet
public Class ClassName{ public int PropName{get;set;} public ClassName{ PropName=0; //Default Value } }