需要声明一个与 c# 中的属性对应的字段
本文关键字:属性 字段 一个 声明 | 更新日期: 2023-09-27 18:35:27
两者有什么区别
private string someText;
public string SomeText
{
get;
set;
}
和
public string SomeText
{
get;
set;
}
什么都没有,您的私有成员没有被使用。
编译器将编译
public string SomeText
{
get;
set;
}
相当于
private string _someText;
public string SomeText
{
get { return _someText; }
set { _someText = value; }
}
你确实意识到你的问题是比较两个平等的东西?(
public string SomeText
{
get;
set;
}
)
我在想你的问题到底是什么 - 两者之间有什么区别
private string someText;
public string SomeText
{
get
{
return someText;
}
set
{
someText = value;
}
}
和:
public string SomeText
{
get;
set;
}
答案是,在第二个示例中,支持字段仍然存在,但是为您创建的 - 并且您对设置/获取没有影响; 而在第一个示例中,您可以进行其他检查以确保它是正在设置的有效值,等等。
我想也许你想知道两者之间的区别
public class Test1
{
private string _text;
public string Text
{
get { return _text; }
set { _text = value; }
}
}
和
public class Test2
{
public string Text
{
get;
set;
}
}
如果你把这两个类拆装成CIL,你会发现它几乎是一样的,除了在第二种情况下,该字段是自动生成的。
第一种情况:
.property instance string Text
{
.get instance string Syner.Test1::get_Text()
.set instance void Syner.Test1::set_Text(string)
}
.field private string _text
第二种情况:
.property instance string Text
{
.get instance string Syner.Test2::get_Text()
.set instance void Syner.Test2::set_Text(string)
}
.field private string <Text>k__BackingField
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
}
第二个只是语法糖:
private string someText;
public string SomeText
{
get { return someText; }
set { someText = value; }
}
第二个自动在幕后为您处理变量创建等。在您的第一个示例中,私有变量someText
永远不会被读取/修改,它只是一个不执行任何操作的类级变量。
您可能想要使用第一个的原因是,如果您需要在 getter/setter 中做一些更复杂的事情。例如,您可能想检查 getter 中是否初始化了某些内容。或者,您可能希望验证资源库中的值。