我刚刚在一个旧的 Windows 窗体应用程序(由设计师创建)中发现了这一行:
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
它似乎正在使用ResourceManager.GetObject()来获取图标。我的问题是关于$
前缀的重要性this
。文档中没有提到美元符号。
美元是否有特殊含义(可能是反射?)或仅与执行有关GetObject()
?
另外图标实际存储在哪里?
这是 .NET 中使用的一个非常标准的技巧,编译器在需要为自动生成的类或字段生成名称时也会使用它。使用 like 字符$
可确保程序中的标识符永远不会发生名称冲突。
当你只用 C# 编程时,这种可能性不大,这是一个关键字。但肯定是其他语言。例如,您可以创建一个 VB.NET Winforms 项目,在表单上放置一个按钮并将其命名为“this”。本地化表单时,按钮的 Text 属性源显示为:
<data name="this.Text" xml:space="preserve">
<value>Button1</value>
</data>
如果它没有将 $ 放在它前面,那将是与表单的 Text 属性资源的名称冲突。除非您使用一种允许在标识符名称中使用 $ 的语言进行编程。标准的 VS 语言都没有。
另一个细节是,您将无法从 C# 代码中引用该按钮。也有一个逃生口,你可以在你的代码中使用@this。@ 前缀确保编译器不会将其识别为关键字,而只是一个普通标识符。
The WinForms designer actually dumps quite a bit of hidden items like this into the resource file (.resx) assocaited with each form in order to support, mostly, internationalization (though other designer meta-data is there as well). While text and icons may be obvious, even layout information can be there. I suppose those German words are pretty long so when internationalizaing the form you may actually need to change label widths.
The $ I would assume is a way to make sure the designer-added resources don't conflict with user resources.
It turns out that the icon is stored within the corresponding .resx
file and was actually defined with the dollar prefix $this.Icon
. This would imply that the dollar doesn't have a special meaning at all.