C# resource.GetObject中使用的美元($)字符
我刚刚在一个旧的Windows窗体应用程序(由设计师创建)中发现了这一行: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
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