如何为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 } }