resource.GetObject中使用的Dollar($)字符

时间:2012-06-13 15:52:13

标签: c# .net winforms string icons

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

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

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

美元是否具有特殊含义(可能反映?)或仅仅与GetObject()的实施有关?

此外,实际存储的图标在哪里?

3 个答案:

答案 0 :(得分:3)

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

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

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

如果它没有将$放在它前面,那将是与表单的Text属性资源的名称冲突。直到您使用允许$ in in identifier name的语言编程。没有标准的VS语言。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

事实证明,该图标存储在相应的.resx文件中,实际上是使用美元前缀$this.Icon定义的。这意味着美元根本没有特殊意义。