Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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# - Fatal编程技术网

C# 自动实现属性中的私有变量在哪里/是什么?

C# 自动实现属性中的私有变量在哪里/是什么?,c#,C#,没有(显式)引用firstName应该隐藏的firstName私有变量。你能解释一下这是怎么回事吗? 我假设有一些私有变量正在被获取和设置。 谢谢 对, 编译器创建一个私有的匿名备份字段,该字段只能通过属性的get和set访问器访问。(c) 编辑: 定义属性时,编译器将发出两种方法:get\u XXX和set\u XXX。当C#编译器看到试图获取或设置属性的代码时,编译器实际上会发出对其中一个方法的调用。(c) “CLR via c#”c#编译器在后台创建备份存储字段,您可以尝试对其进行反编译。

没有(显式)引用firstName应该隐藏的firstName私有变量。你能解释一下这是怎么回事吗? 我假设有一些私有变量正在被获取和设置。 谢谢

对,
编译器创建一个私有的匿名备份字段,该字段只能通过属性的get和set访问器访问。
(c)

编辑:
定义属性时,编译器将发出两种方法:
get\u XXX
set\u XXX
。当C#编译器看到试图获取或设置属性的代码时,编译器实际上会发出对其中一个方法的调用。(c) “CLR via c#”

c#编译器在后台创建备份存储字段,您可以尝试对其进行反编译。使用反射器。您将了解它是如何创建备份字段的。


其他人已经回答了这个问题,但还有一些进一步的信息。。。您可以在运行时使用反射查找备份字段。查找命名为>k_uubackingfield的字段

另一个可能有帮助的帖子:


基本上,编译器会将您的代码转换为如下内容:

private string <__>firstName;

public string FirstName
{
    get { return <__>firstName; }
    set { <__>firstName = value; }
}
私有字符串名;
公共字符串名
{
获取{return firstName;}
设置{firstName=value;}
}
这不太可能是确切的名字,但名字中使用尖括号是很重要的,因为它使它成为一个难以形容的名字。(这是非官方术语,但被广泛使用——我不知道Eric Lippert是否真的创造了它,或者他是否只是我读到的东西中第一个使用它的人。)这是一个不是有效的C#标识符的名称,但CLR对此相当满意。这有两个好处:

  • 编译器不需要担心与标识符的命名冲突
  • 编译器不需要担心您是否试图在自己的代码中引用该字段-您不能,因为名称无法描述

它对所有其他生成的代码使用相同的技术-匿名类型、匿名函数、迭代器块等。

这是重复的。我想我是从安德斯那里学来这个暗语的;我不知道他是从哪里弄来的。
private string <__>firstName;

public string FirstName
{
    get { return <__>firstName; }
    set { <__>firstName = value; }
}