2012-06-13 2 views
3

Я просто увидел эту строку в старом Windows Forms приложения (созданное дизайнер):

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

, кажется, используют ResourceManager.GetObject() для того, чтобы получить значок. Мой вопрос касается значимости префикса $this. В документах не упоминается символ доллара.

Действительно ли доллар имеет особое значение (отражение возможно?) Или просто связано с реализацией GetObject()?

Кроме того, где значок фактически хранится?

+0

И как соответствующий ресурс (Icon) определен в файле resx? –

+0

@HenkHolterman - Хорошо, я думаю, вы помогли мне ответить на мой собственный вопрос. Я забыл о файлах .resx (не дотрагивался до WinForms целую вечность), и есть, определяется как '$ this.Icon'. –

ответ

1

Дизайнер WinForms фактически сбрасывает довольно много скрытых элементов, подобных этому, в файл ресурсов (.resx), связанный с каждой формой, чтобы поддерживать, в основном, интернационализацию (хотя есть и другие метаданные дизайнера). Хотя текст и значки могут быть очевидными, может быть даже информация о макете. Я полагаю, что эти немецкие слова довольно длинные, поэтому при интернационализации формы вам может понадобиться изменить ширину меток.

$ Я бы предположил, что это означает, что ресурсы, добавленные разработчиком, не конфликтуют с пользовательскими ресурсами.

0

Оказалось, что значок сохраняется в соответствующем файле .resx и на самом деле был определен с помощью префикса доллара $this.Icon. Это означало бы, что доллар вообще не имеет особого значения.

+0

Особого смысла в том, что значок сборки доступен с помощью «$ this.Icon», и значок сборки не нужно добавлять в resx –

3

Это довольно стандартный трюк, используемый в .NET, компилятор также использует его, когда ему нужно сгенерировать имя для автоматически генерируемого класса или поля. Использование такого символа, как $, гарантирует, что никогда не может быть столкновение имен с идентификатором в программе.

Существует мало шансов на то, что когда вы только программируете на C#, это - это ключевое слово. Но, конечно же, на других языках. Например, вы можете создать проект VB.NET Winforms, отбросить кнопку в форме и назовите ее «это». При локализации формы, появляется источник текста свойства этой кнопки как:

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

Это было бы имя столкновение с текстом ресурсом имущественной формы, если он не ставил $ перед ним. Пока вы не программируете на языке, который в любом случае допускает $ в имени идентификатора. Ни один из стандартных языков VS не делает.

Еще одна деталь заключается в том, что у вас возникнут проблемы с ссылкой на эту кнопку из кода C#. Для этого есть люк-побег, вы можете использовать @this в своем коде. Префикс @ гарантирует, что компилятор не распознает его как ключевое слово, а просто простой идентификатор.

+0

+1 Отличный ответ, спасибо –