需要声明与c#中的属性对应的字段吗?
两者的区别是什么需要声明与c#中的属性对应的字段吗?,c#,properties,C#,Properties,两者的区别是什么 private string someText; public string SomeText { get; set; } 及 没什么,你的私人会员没有被使用 编译器将编译 public string SomeText { get; set; } 相当于 private string _someText; public string SomeText { get { return _someText; } set { _s
private string someText;
public string SomeText
{
get;
set;
}
及
没什么,你的私人会员没有被使用 编译器将编译
public string SomeText
{
get;
set;
}
相当于
private string _someText;
public string SomeText
{
get { return _someText; }
set { _someText = value; }
}
第二个是语法糖:
private string someText;
public string SomeText
{
get { return someText; }
set { someText = value; }
}
第二个在幕后自动为您处理变量创建等。在第一个示例中,私有变量someText
永远不会被读取/修改,它只是一个不做任何事情的类级变量
您可能希望使用第一种方法的原因是,如果您需要在getter/setter中执行更复杂的操作。例如,您可能希望检查getter中是否初始化了某些内容。或者您可能想验证setter中的值。您是否意识到您的问题是比较两个相等的东西? ( ) 我在想你的问题到底是什么——两者之间的区别是什么
private string someText;
public string SomeText
{
get
{
return someText;
}
set
{
someText = value;
}
}
public class Test1
{
private string _text;
public string Text
{
get { return _text; }
set { _text = value; }
}
}
以及:
public string SomeText
{
get;
set;
}
答案是,在第二个示例中,支持字段仍然存在,但是为您创建的-您对设置/获取没有影响;而在第一个示例中,您可以进行其他检查以确保设置的值有效,等等。我想您可能想知道
private string someText;
public string SomeText
{
get
{
return someText;
}
set
{
someText = value;
}
}
public class Test1
{
private string _text;
public string Text
{
get { return _text; }
set { _text = value; }
}
}
及
如果你把这两个类分解成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()
}
.property实例字符串文本
{
.get实例字符串Syner.Test2::get_Text()
.set实例void Syner.Test2::set_文本(字符串)
}
.field私有字符串k__BackingField
{
.custom instance void[mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
}
我不是C#专家,但第一个示例似乎没有真正使用私有字符串。通过阅读官方感谢您的建议,您可能会学到很多东西。我认为这里的一个重要点是,该字段实际上不是名为\u someText
,它的名称是您无法在代码中写入的。@svick是的,但我认为最好显示正确的命名标准并说“等效”而不是去寻找它实际生成的确切代码[CompilerGenerated]私有字符串k_ubackingfield代码>您的意思是,就像在第一个示例中一样,该字段实际上已被使用。
.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()
}