3

У меня есть простое приложение на WinForms. Есть различные кнопки: Add, Edit, Delete, Search и т. д.
Для этих кнопок я создал свойства, например:

public Button ButtonEdit
{
    get { return buttonEdit; }
    set { buttonEdit = value; }
}

С помощью свойств я обращаюсь к кнопкам из бизнес-логики, делая их enabled в зависимости от условий.

Так вот, после того, как я напишу такое свойство, Resharper предлагает сконвертировать его в автоматическое, то есть в такое:

public Button ButtonEdit { get; set; }

И оно тоже работает правильно.
Как в таком случае понятно, что нужно обращаться к кнопке buttonEdit?

  • Это синтаксический сахар, компилятор всё равно разворачивает вторую конструкцию в первую. Поле и свойства - вот ключевые слова, читайте. Вот тут ещё было. – A K Jul 09 '16 at 16:15
  • Я это понимаю. Я о другом: как в таком случае компилятор понимает, что нужно обращаться к кнопке buttonEdit, а не к кнопке buttonAdd например ? – Владимир Jul 09 '16 at 16:18
  • Очевидно - по названию. – A K Jul 09 '16 at 16:21
  • Я вот добавил себе свойство такое: public Button ButtonTest { get; set; } И компилятор автоматически кнопку не нашёл. А вот добавил так: public Button ButtonTest { get { return buttonTest; } set { buttonTest = value; } }

    И появилась подсказка от Решарпера, чтобы сконвертировать в автоматическое св-во, я нажал. И тогда всё работает правильно.

    То есть сначала нужно указать нужную кнопку, а потом он её запоминает выходит.

    – Владимир Jul 09 '16 at 17:00
  • 1
    @Владимир, стоит сравнить состояние автосгенерированного файла формы, вначале и после конвертации решарпером – Grundy Jul 09 '16 at 17:21
  • 2
    @AK вот только если при этом buttonEdit - это созданная через дизайнер кнопка, то дизайнеру WinForms может внезапно не понравится исчезновение сгенерированного поля (решарпер же удаляет поле buttonEdit при такой конвертации) –  Jul 09 '16 at 19:09

1 Answers1

2

Очень просто.

Если вы используете автоматическое свойство (public Button ButtonEdit { get; set; }), то поле для этого свойства компилятор генерирует сам, и использует. То есть он при этом не будет использовать ни buttonEdit, ни buttonAdd. Это автоматически сгенерированное свойство недоступно вам по имени. Но если очень захотеть, его можно найти через рефлексию: компилятор выдумывает для него нечитаемое имя, запрещённое языком, чтобы случайно не попасть в определённое вами имя, относящееся к чему-то другому.

VladD
  • 206,799
  • Спасибо! Но это выдуманное имя создаётся именно после того, как я напишу свойство с телом геттера и сеттера и тогда Решарпер предлагает сконвертировать в автоматическое свойство. И, сделав это, он уже использует своё придуманное имя для той кнопки, которую я указал в теле, верно ? – Владимир Jul 09 '16 at 17:47
  • @Владимир: Именно так. Выдуманное имя используется только для свойств, определённых с get; set;. Для остальных поле не создаётся, и компилятор использует то, что вы написали сами в коде. – VladD Jul 09 '16 at 17:52