Страницы

Поиск по вопросам

понедельник, 2 декабря 2019 г.

.NET Core: Случай получения значения поля из свойства

#c_sharp #aspnet_core #net_core


Работая с ASP.NET Core Identity, я очередной раз заглянул в исходный код на GitHub
и увидел в классе IdentityResult следующие строки:

public class IdentityResult
    {
        private List _errors = new List();
        ...

        public IEnumerable Errors => _errors;
        ...
    }


Конечно, наверное это сильно выдернуто из контекста, но тем не менее мне не понятно,
зачем было создавать отдельное поле _errors, а потом чтобы получить его значение отдельно
создавать свойство Errors (да, если я не ошибаюсь это именно свойство, а не метод)
вместо того, чтобы просто написать:

public List Errors { get; } = new List();


Я бы понял если бы это был какой-то легаси код, но как никак .NET Core.
    


Ответы

Ответ 1



Смысл такого разделения - в том, что наружу отдается только возможность перечисления списка, но не его модификация. В вашем же варианте внешний по отношению к классу код сможет менять список ошибок.

Ответ 2



вместо того, чтобы просто написать: public List Errors { get; } = new List(); Тогда извне будут доступны методы интерфейса IList, которые изменяют коллекцию: Clear, Add, Remove. Видимо автор кода не хотел, чтобы кто-то мог вносить изменения, поэтому коллекцию Errors сделали доступным только для перечисления через интерфейс IEnumerable, который не содержит методов способных внести изменения.

Ответ 3



Определил два преимущества , который много используется в фреймворках. ваше пример: // конкретный: структура данных List 1. "private" List _errors = new List(); // абстрактный контракт - перечисление (base contract) 2. "public" IEnumerable Errors => _errors; Смотрите на модификатор доступа то есть конкретный тип (1) private. Ну абстрактный контракт (2) public. это является локализация для дальнейшей изменения чтобы не влиять другим модулем. То есть мы можем List изменить на Stack это не будет влиять на другим клиентам то есть изменения локализован (здесь и подразумевается слабая связанность (то есть автор гарантирует)). Здесь нарушается сокрытие информации потому что возвращает структуру данных.И поэтому он использует тип перечисление IEnumerable чтобы сокрыть внутренние данные , чтобы клиент не манипулировал Remove , Update , Add. То есть можно было использовать клонирование но это дорогостоящая операция (оперативная память и так далее) поэтому здесь использовано сокрытие информации (высокоуровневый,абстрактный интерфейс перечисление) IEnumerable (доступ только для перечисления). P.S Localization : Когда будет изменение изменение будет в одном месте или изменение будет минимизирован.

Комментариев нет:

Отправить комментарий