C#getter/setter幕后的内部名称
本文关键字:内部 setter C#getter | 更新日期: 2023-09-27 18:22:04
可能重复:
我可以用get和set代码创建一个自动属性(没有私有成员)吗
访问自动属性-c#
我曾使用过显式getter/setter,如
private bool myField;
public bool MyField
{ get { return myField; }
set { myField = value; }
}
现在,使用C#.net 4.0,您可以缩写
public bool MyField
{ get; set; }
现在,如果我只想覆盖SET部分,我应该引用的内部引用是什么。。。在第一个示例中,我知道我明确引用的是"myField"的私有项,但在第二个版本中,我引用的是什么?编译器是否只是抛出一个隐含的"_"(如_MyField)作为元素的私有端?
class Parent
{
public virtual bool MyField { get; set; }
}
class Child : Parent
{
public override bool MyField
{
//ommitting get portion
set
{
//other custom code goes here
base.MyField = value;
}
}
}
在这里,一个类继承自一个具有属性的类,该属性只覆盖setter。或者,您可以覆盖getter并将其作为返回基。MyField不更改功能。
编辑:有人提出了这样一个问题,即在执行此操作时,被遗漏的一半(在我的示例中为get)将不存在于子类中,从而使属性仅可读/写。事实并非如此,被遗漏的那一半只是从其父代继承了它的功能。请参阅下面添加到我的示例中的内容进行演示。
Child c = new Child();
c.MyField = true;
if (c.MyField)
{
Console.WriteLine("hi");
}
(这确实会打印"hi",编译或运行时没有错误。)
无论编译器在这种情况下做什么,都是一个实现细节,将来可能会更改,而无需另行通知!
因此,我强烈建议不要让您的代码依赖于这样的实现细节,在这种情况下只使用第一个选项(覆盖两个访问器并具有明确支持属性的字段)。。。
您可以使用MyField
以相同的方式访问属性。但是,如果您不希望类外的代码能够设置属性,则可以使用:
public bool MyField { get; private set; }