Использовать автоматически реализованное свойство или реализовать свойство самостоятельно - PullRequest
3 голосов
/ 10 января 2012

В C # мы можем создать автоматически реализованное свойство, подобное этому

public string MyValue{get;set;}

Тем не менее, мы также можем создать свойство самостоятельно таким образом

private string _myValue;
public string MyValue
{
    get { retrun _myValue; }
    set { _myValue = value; }
}

У меня вопрос, в какой ситуации мы должны использовать автоматическую и какую ситуацию мы должны реализовать сами?

Ответы [ 3 ]

5 голосов
/ 10 января 2012

Существует по крайней мере один явный случай, в котором вы НЕ должны использовать автоматически реализуемые свойства: любой вид двоичной сериализации между двумя разными DLL.

Двоичная сериализация опирается на частные члены, и частные вспомогательные элементы для автоматически реализуемых свойств не обязательно будут одинаковыми в каждой скомпилированной DLL, поэтому двоичная сериализация может очень сильно потерпеть неудачу.

Еще одна причина, по которой вы не будете использовать автоматически внедряемые свойства, заключается в том, что вы потеряете контроль над возможностью - указать поле поддержки как NonSerialized, но в этом случае достаточно просто создать поле поддержки для свойства.

Если вы или какой-либо другой продукт, который вы используете, выполняет отражение на участниках (например, WCF), тогда вы увидите искаженное имя вспомогательного поля вместо «симпатичного» созданного вами вспомогательного поля.

Это может быть очень важно, если вы ранее предоставили доступ к сервису или если вы десериализовали на принимающей стороне одну и ту же структуру классов (т.е. те же классы используются на обоих концах канала WCF). В этом случае вы не обязательно сможете десериализовать, потому что можете гарантировать, что имя вспомогательного поля будет одинаковым, если только вы не используете одну и ту же DLL в отличие от исходного кода.

Например, предположим, что у вас есть служба, которая предоставляет некоторые из ваших бизнес-объектов через WCF созданному вами клиенту silverlight. Чтобы повторно использовать вашу бизнес-логику, ваш клиент Silverlight добавляет ссылки на исходный код для ваших бизнес-объектов. Если у вас есть автоматически реализованные свойства, вы не можете контролировать имя вспомогательного поля. Поскольку WCF сериализует элементы, а не свойства, вы не можете быть уверены, что объект, перенесенный в silverlight из службы WCF, будет десериализован правильно, потому что имена вспомогательных полей почти наверняка не будут совпадать.

4 голосов
/ 10 января 2012

Подход, который я использую к этому вопросу, прост, но прагматичен.

Всегда используйте свойство AutoImplemented до тех пор, пока не станет очевидно, что вам нужно сделать что-то другое, после чего я произвожу рефакторинг. И это станет очевидным.

Мне нравится удобочитаемость авто-свойств, но у них есть свои ограничения. Использование такого инструмента, как ReSharper, делает рефакторинг ослепительно простым, а в некоторых случаях R # даже примет решение за вас.

3 голосов
/ 10 января 2012

В приведенном вами примере промежуточный язык (IL) будет примерно таким же.

Однако могут быть случаи, когда вам нужно кодировать логику вмешательства без влияния на клиентов, использующих ее. Автоматическое свойство отлично подходит для такого типа ситуаций, потому что оно может быть объявлено, а затем изменено для добавления явного вспомогательного поля. С полем поддержки можно манипулировать в получателе / ​​установщике, чтобы соответствовать требованиям валидации и верификации, не затрагивая другие биты библиотеки или сборки. В итоге вы можете сделать свойство «безопасным», не нарушая изменений.

Еще одна причина для объявления вспомогательного поля возникает, например, в WPF, где свойство объявляется ...

private string myVar;
public string MyProperty
{
    [DebuggerStepThrough]
    get { return myVar; }
    [DebuggerStepThrough]
    set
    {
        if (value != myVar)
        {
            myVar = value;
            OnPropertyChanged("MyProperty");
        }
    }
}

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

Таким образом, как общее правило, вы можете первоначально объявить свои свойства, используя автоматический синтаксис с целью дополнения их методами получения / установки, когда требуется вмешательство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...