Авто свойство - ошибка резкости или классная неизвестная функция C #? - PullRequest
2 голосов
/ 28 января 2010

У меня есть следующий код:

public interface IMyInterface
{
    DataGrid ItemsInGrid { get; set; }
}

partial public class MyClass: Window, IMyInterface
{
   public DataGrid ItemsInGrid 
   {
       get { return grdItemsInGrid}
       set { grdItemsInGrid= value; }
   }
}

В другом файле:

partial public class MyClass: Window
{
   private System.Windows.Forms.DataGrid grdItemsInGrid;

   // Reference to private variable here
   // This is the designer portion that actually sets up the 
   // private variable to be shown on the form.
}

Теперь resharper хочет, чтобы я конвертировал ItemsInGrid в автопринадлежность (public DataGrid ItemsInGrid{ get; set; })

Как это может быть равным преобразованием? Autoproperty создаст скрытую переменную поддержки, которая не будет соответствовать частному grdItemsInGrid верно?

Резарпер сломан? или в C # .NET есть что-то, чего я не знаю?


EDIT: Я чувствую общее недоразумение здесь. grdItemsInGrid - это сетка, отображаемая на форме (MyClass фактически реализует Window). Идея состоит в том, чтобы предоставить доступ к grdItemsInGrid сценариям, в которых MyClass передается как IMyInterface методу.

Ответы [ 9 ]

4 голосов
/ 28 января 2010

Насколько я понимаю, это ошибка в resharper. Рассматриваемая закрытая переменная является элементом формы. Я не показывал это, потому что не понимал, что это актуально. Потому что форма находится в другом файле (это частичный класс). Решарпер не понимает, что на частную переменную ссылаются, и думает, что я могу просто перейти к свойству auto.

Как только я ссылался на приватную переменную в том же файле, ReSharper перестал намекать, что я должен преобразовать в свойство auto. (Но он не понимал, что на него ссылаются в частичном классе для целей этого рефакторинга.)

4 голосов
/ 28 января 2010

Автозапчасти устраняют необходимость в видимой переменной поддержки. Здесь ничего не сломано. Это просто очень удобная функция.

1 голос
/ 28 января 2010

Ваш интерфейсный контракт определяет имя свойства, а не закрытую переменную поддержки.

Таким образом, предложенный рефакторинг действителен.

1 голос
/ 28 января 2010

Это равное преобразование. Вы абсолютно правы в этом, используя скрытую переменную поддержки.

Вот страница MSDN о языковой функции: http://msdn.microsoft.com/en-us/library/bb384054.aspx

0 голосов
/ 28 января 2010

Нет логики в сеттере или геттере. Так как же этот рефакторинг может каким-либо образом изменить ваш код?

ReSharper знает это и покажет вам рефакторинг, потому что он очевиден.

Что заставляет вас думать, есть ли какие-либо изменения в поведении вашего кода?

0 голосов
/ 28 января 2010

Если вы не собираетесь делать что-то особенное с этим частным полем, вы можете спокойно принять предложение Решарпера. Это будет работать точно так же. Я не уверен, удалит ли reshaper приватный член в вашем случае, так как он называется grdItemsInGrid, а не itemsInGrid.

0 голосов
/ 28 января 2010

Свойство Auto - это функция VS 2008, которая запрещает ленивым программистам (таким как я;)) использовать открытые поля в своих классах, и компилятор выполнит работу за вас (как вы сказали, за кулисами), и будет частная переменная поддержка вашей собственности (вы можете использовать Reflector, чтобы увидеть, что происходит) Пока неявная реализация интерфейса заботится, должно быть свойство с заданным именем, объявленным в вашем классе, не имеет значения, является ли это автоматическим свойством или нет.

0 голосов
/ 28 января 2010

Я не вижу твоей проблемы? Нет, autoproperty не будет соответствовать grdItemsInGrid, но для чего вам нужен grdItemsInGrid? Ваш класс будет взаимодействовать с ItemsInGrid напрямую, поскольку у вас нет доступа к скрытому полю поддержки, но в вашей логике этот доступ вам в любом случае не нужен.

0 голосов
/ 28 января 2010

Вы пробовали это? Возможно, он собирается удалить grdItemsInGrid, а затем исправить все ссылки на него, чтобы они вместо этого использовали свойство.

...