Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要声明与c#中的属性对应的字段吗?_C#_Properties - Fatal编程技术网

需要声明与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()
}