为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
    }
}
相关文章
相关标签/搜索