3

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

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

它似乎正在使用ResourceManager.GetObject()来获取图标。我的问题是关于$前缀的重要性this。文档中没有提到美元符号。

美元是否有特殊含义(可能是反射?)或仅与执行有关GetObject()

另外图标实际存储在哪里?

4

3 回答 3

3

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

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

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

如果它没有将 $ 放在它前面,那将是与表单的 Text 属性资源的名称冲突。除非您使用一种允许在标识符名称中使用 $ 的语言进行编程。标准的 VS 语言都没有。

另一个细节是,您将无法从 C# 代码中引用该按钮。也有一个逃生口,你可以在你的代码中使用@this。@ 前缀确保编译器不会将其识别为关键字,而只是一个普通标识符。

于 2012-06-13T16:39:54.950 回答
1

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.

于 2012-06-13T15:59:19.627 回答
0

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.

于 2012-06-13T15:59:27.880 回答