java 属性 初始值_为C#自动属性赋予初始值的最佳方法是什么?

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

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值