不确定我是否正确说明了这一点......但我有以下代码:
public Guid ItemId
{
get;
}
public TransactionItem()
{
this.ItemId = Guid.Empty;
}
当然,我得到一个只读的问题......我明白了。无论如何设置此属性值而不必执行以下操作:
Guid _itemId = Guid.Empty;
public Guid ItemId
{
get
{
return _itemId;
}
set
{
_itemId = value;
}
}
或
public Guid ItemId
{
get;
internal set;
}
提前致谢!
答案 0 :(得分:32)
我会这样做:
public Guid ItemId
{
get;
private set; // can omit as of C# 6
}
public TransactionItem()
{
this.ItemId = Guid.Empty;
}
当然,在本课程中设置它是开放的,但是既然你正在编写它,我希望你有理由不打破你自己的意图......
在我看来,从外面看,像readonly属性这样的东西最重要。从内到外,它并不重要,因为那里,你是国王=)
答案 1 :(得分:4)
如果您只需要ItemId
属性对您班级的外部用户是只读的,那么Svish的回答是可行的方法。
如果您需要ItemId
在课堂内只读,那么您需要执行以下操作:
private readonly Guid _ItemId
public Guid ItemId
{
get { return _ItemId; }
}
public TransactionItem()
{
_ItemId = Guid.Empty;
}
答案 2 :(得分:2)
您可以使用readonly关键字
public readonly Guid ItemId;
public TransactionItem()
{
this.ItemId = Guid.Empty;
}
答案 3 :(得分:2)
我担心你的问题不是很明确 - 但是如果没有定义属性设置器,那么你当然不能称之为。
在自动实现的只读属性之后,你实际上是,允许在构造函数中进行设置吗?如果是这样的话,我恐怕没有,就像我喜欢的那样。
为了扩展我的意思,我喜欢能够做到:
// Not valid in C# - yet!
public class Foo
{
// Autogenerated field would be readonly in IL.
public string Name { get; readonly set; }
public Foo (string name)
{
this.Name = name;
}
public void Bar()
{
// This would be invalid
this.Name = "No!";
}
}
基本上它会“使一个属性像一个只读字段。”
答案 4 :(得分:0)
使用私人设定者,或设置支持字段?
(但是,您必须确保可以根据属性名称确定支持字段的名称
例如,确保您的支持字段始终与property-name具有相同的名称,但前缀为下划线;就像NHibernate
使用其访问策略一样。