![](/img/trans.png)
[英]How to assign a value to a property of an object only if that object is not null in c#
[英]How can C# constructor assign value to read only property?
我写了一个只有 get 访问器的 class 属性,例如:
public int MyProp { get; }
我不能通过我的 class 中的方法为 MyProp 分配任何值,甚至不能私下分配,也就是说,这不像我有一个私有集。 但是,不知何故,我可以使用如下构造函数为 myProp 设置一个值:
public MyClass (int myProp) { this.MyProp = myProp; }
构造函数是否总是不受属性访问器规范的影响? 它们仅在构造函数运行后才有效吗?
创建自动属性时,编译器会自动生成支持字段来支持它。 对于只读(仅get
)属性,情况仍然如此。 能够在构造函数中分配给get
-only 属性只是编译器支持的语法糖。 当您分配给属性时,编译器会转换代码,以便它分配给支持字段。
例如,假设您的构造函数:
public MyClass(int myProp)
{
this.MyProp = myProp;
}
这由编译器翻译成类似于以下内容:
public MyClass(int myProp)
{
this._myPropBackingField = myProp;
}
您没有set
访问器的事实会阻止您在其他任何地方分配该属性。
实际上,支持字段会收到一个“不可描述”的名称,该名称是非法的 c#(但有效的 IL),因此会阻止您尝试直接使用该字段。 在编译器完成工作后,您的示例实际上如下所示:
public class MyClass
{
[CompilerGenerated]
private readonly int <MyProp>k__BackingField;
public int MyProp
{
[CompilerGenerated]
get
{
return this.<MyProp>k__BackingField;
}
}
public MyClass(int myProp)
{
this.<MyProp>k__BackingField = myProp;
}
}
请注意,构造函数实际上是直接分配给支持字段<MyProp>k__BackingField
,而不是通过属性的set
ter 间接分配(因为毕竟不存在)。
请参阅此SharpLab 示例。
试想如果不允许构造函数初始化这些值,那么这些值有什么用? 它始终是数据类型的默认值,如 int 它将为 0。通过仅使用 get 意味着我们将不允许在初始化后更改该值。
您也可以使用readonly ,默认情况下它是线程安全的。 但是当您使用私有集时,您必须明确处理线程安全。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.