赞
踩
如何为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;
}
}
有没有更好的办法?
#1楼
为了澄清,是的,您需要在构造函数中为类派生对象设置默认值。 您将需要确保构造函数存在,并且带有适当的访问修饰符以进行构造(如果使用)。 如果对象没有实例化,例如它没有构造函数(例如静态方法),则可以通过该字段设置默认值。 这里的理由是,对象本身将仅创建一次,而您无需实例化它。
@Darren Kopp-好的答案,干净而且正确。 重申一下,您可以为Abstract方法编写构造函数。 编写构造函数时,您只需要从基类访问它们:
基础类的构造函数:
public BaseClassAbstract()
{
this.PropertyName = "Default Name";
}
派生/混凝土/子类的构造函数:
public SubClass() : base() { }
这里的重点是,从基类中提取的实例变量可能会掩埋您的基字段名称。 使用“ this”设置当前实例化的对象值。 将允许您根据实例实例化当前实例和所需的权限级别(访问修饰符),从而正确地形成您的对象。
#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 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";
#5楼
public Class ClassName{
public int PropName{get;set;}
public ClassName{
PropName=0; //Default Value
}
}
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。