Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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# resource.GetObject中使用的美元($)字符_C#_.net_Winforms_String_Icons - Fatal编程技术网

C# resource.GetObject中使用的美元($)字符

C# resource.GetObject中使用的美元($)字符,c#,.net,winforms,string,icons,C#,.net,Winforms,String,Icons,我刚刚在一个旧的Windows窗体应用程序(由设计师创建)中发现了这一行: this.Icon=((System.Drawing.Icon)(resources.GetObject($this.Icon)) 它似乎是为了获得图标而使用的。我的问题是关于$前缀this的意义。文件中没有提到美元符号 美元是否有特殊的含义(可能是反射?),或者仅仅与GetObject()的实现有关 此外,图标实际存储在何处?WinForms designer实际上会将相当多的隐藏项转储到与每个表单关联的资源文件(.r

我刚刚在一个旧的Windows窗体应用程序(由设计师创建)中发现了这一行:

this.Icon=((System.Drawing.Icon)(resources.GetObject($this.Icon))

它似乎是为了获得图标而使用的。我的问题是关于
$
前缀
this
的意义。文件中没有提到美元符号

美元是否有特殊的含义(可能是反射?),或者仅仅与
GetObject()
的实现有关


此外,图标实际存储在何处?

WinForms designer实际上会将相当多的隐藏项转储到与每个表单关联的资源文件(.resx)中,以便主要支持国际化(尽管还有其他设计器元数据)。虽然文本和图标可能很明显,但甚至布局信息也可能存在。我想这些德语单词相当长,所以当国际化表单时,您可能实际上需要更改标签宽度


我假设$I是一种确保设计师添加的资源不会与用户资源冲突的方法。

结果表明,图标存储在相应的
.resx
文件中,并且实际上是用美元前缀
$this.icon
定义的。这意味着美元根本没有特殊意义。

这是.NET中使用的一个非常标准的技巧,编译器在需要为自动生成的类或字段生成名称时也会使用它。使用像
$
这样的字符可以确保程序中的标识符永远不会与名称冲突

当你只使用C语言编程时,这种可能性不大,这是一个关键词。但肯定是用其他语言。例如,您可以创建一个VB.NET Winforms项目,在表单上放置一个按钮并将其命名为“this”。本地化表单时,按钮的文本属性源显示为:

  <data name="this.Text" xml:space="preserve">
    <value>Button1</value>
  </data>

按钮1
如果表单没有将$放在前面,那么这将是与表单的文本属性资源的名称冲突。除非您使用允许在标识符名称中输入$的语言编程。标准VS语言都没有


还有一个细节是,从C#代码中引用该按钮会有困难。还有一个逃生舱,你可以在代码中使用@this。@prefix确保编译器不会将其识别为关键字,而只是一个普通标识符。

以及resx文件中对应的资源(图标)是如何定义的?@HenkHolterman-好的,我想你帮助我回答了我自己的问题。我已经忘记了.resx文件(很久没有接触WinForms了),有,定义为
$this.Icon
。这是特别的意思,而不是程序集图标可以使用“$this.Icon”访问,并且程序集图标不需要添加到resx