Я использую .NET 4.5 в добавлении VSTO для Outlook 2013. У меня есть некоторые проблемы с полным пониманием свойств и аксессуаров. Автоматически реализованные аксессоры, которые я предполагаю, когда вы просто пишете get; задавать; а не получать {// code} и т. д., также дают мне проблемы. У меня есть словарь, который я использую внутри себя в своем классе. Вот мой код:Свойства и автоматическая реализация
private Dictionary<string, string> clientDict { get; set; }
private Dictionary<string, string> clientHistoryDict { get; set; }
затем позже:
clientDict = new Dictionary<string, string>();
clientHistoryDict = new Dictionary<string, string>();
Я использую те же имена, что и свойства в коде позже, в том же классе.
Я никогда не пишу:
private Dictionary<string, string> _clientDict; // etc.
создать переменные я просто использовал напрямую.
Я попытался изменить свой код, чтобы сделать это, и у меня были некоторые проблемы, и я понял, что мое понимание свойств немного перепутано.
Вот несколько вопросов, которые мне необходимо уточнить, и я не могу найти правильный ответ.
Во-первых, есть ли основания для использования частной собственности? Мои словари никогда не доступны вне класса или в любых производных классах, поэтому есть ли причина использовать свойства? Я не использую никакой специальной проверки или ничего в установщике или что-то в этом роде.
Во-вторых, когда я попытался изменить свой код, чтобы использовать переменные, а затем получить к ним доступ через свойства, подобные вашему типичному примеру свойств, я столкнулся с проблемами. Я нашел пример, где получатель был установлен в return _clientDict
, но сеттер был только Это дало мне ошибку: я должен дать набор тела, потому что он не абстрактный или частичный. Почему в этом случае это не было бы автоматическим установщиком для меня?
Последнее, когда я вызываю new в свойствах того же класса, в котором он объявлен, в чем разница между выполнением этого свойства и обычной переменной того же типа? Действительно ли свойства отличаются от переменных в этом случае? Неправильная практика использовать свойства таким образом, когда это должно быть выполнено с помощью частных переменных?
Это могут быть некоторые ошибочные вопросы, но я не могу найти другое место, в котором есть информация, которая поможет мне понять эти различия. Я играл со свойствами, чтобы попытаться понять все это, но я мог бы использовать так, чтобы мне помогали.
Огромная помощь очень благодарна, просто какое-то разъяснение? Что вы подразумеваете под полями, у них нет спецификаторов доступа? Не будет ли примером частного члена переменной? Я думаю, что я пропускаю то, что вы подразумеваете под полем. – shenk
Аргумент для частных свойств - это потенциал для будущих изменений. Хотя теперь у вас нет логики проверки, вы можете в будущем, и у вас уже есть свойство, которое дает вам одно место для изменения этой логики, вместо того, чтобы каждое место присваивается в вашем классе, что упрощает сохранение ваших инвариантов класса. Это может быть не аргумент * great *, особенно во всех случаях, но он * может * помочь инкапсулировать некоторые типы волатильности. –
@shenk Свойство может сделать это: 'public string Foo {get; защищенный набор; } ', что означает, что только производные типы могут устанавливать значение' Foo'. Поле не может этого сделать. –