3

古いWindowsフォームアプリ(デザイナーによって作成された)でこの行を見つけました:

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

アイコンを取得するためにResourceManager.GetObject()を使用しているようです。$私の質問は、接頭辞の重要性に関するものthisです。ドキュメントにはドル記号についての言及はありません。

ドルには特別な意味がありますか(おそらく反射ですか?)、それとも単にの実装に関係していGetObject()ますか?

さらに、アイコンは実際にどこに保存されていますか?

4

3 に答える 3

3

これは、.NET で使用される非常に標準的なトリックです。自動生成されたクラスまたはフィールドの名前を生成する必要がある場合、コンパイラもこれを使用します。のような文字を使用する$と、プログラム内の識別子との名前の衝突が発生しないことが保証されます。

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 に答える