Как написать стенографию следующего сценария?
get
{
if (_rows == null)
{
_rows = new List<Row>();
}
return _rows;
}
Как написать стенографию следующего сценария?
get
{
if (_rows == null)
{
_rows = new List<Row>();
}
return _rows;
}
Использование оператора с нулевой связью (??):
get
{
_rows = _rows ?? new List<Row>();
return _rows;
}
ИЛИ (менее читаемый):
get { return _rows ?? (_rows = new List<Row>()); }
оператор называется нуль-коалесцирующим оператором. Он возвращает левый операнд, если операнд не равен нулю; в противном случае он возвращает правый операнд.
Это ленивый шаблон инициализации, поэтому простым способом было бы использовать класс Lazy <T> .
class Foo
{
Lazy<List<Row>> _rows;
public Foo()
{
_rows = new Lazy(() => new List<Row>());
}
public List<Row> Rows
{
get { return _rows.Value; }
}
}
Это имеет дополнительное преимущество в том, что он не "загрязняет" геттер логикой инициализации.
Я предлагаю тернарный оператор
get {
return _rows == null ? _rows = new List<Row>() : _rows;
}
Или, поскольку пустой List<Row>
не приносит больших издержек, почему бы не избавиться от явного поля _row
и реализовать свойство только для чтения (синтаксис С# 6.0):
public IList<Row> Rows {get;} = new List<Row>();
Вот лучшая идея: Предотвратить _rows
от когда-либо null
.
Сделайте свой конструктор инициализацией переменной:
public MyClass()
{
this._rows = new List<Row>();
}
а затем ваше свойство просто
get
{
return this._rows;
}
Убедитесь, что если вам нужно "очистить" переменную, вы всегда вызываете ее метод Clear
или назначаете новый пустой список вместо назначения null
. Может быть, кодировать эту операцию в методе, если вам действительно нужно сделать ее понятной и последовательной во всем классе.
Это гораздо логичнее. Если ваша переменная никогда не должна быть null
, она никогда не должна быть null
. Он также аккуратно избегает как условного, так и проблемы с состоянием изменения геттера.
List<Row> _rows;
public List<Row> Rows => _rows ?? (_rows = new List<Row>());
Как говорили другие, вы можете использовать оператор с нулевым коалесцированием в этом сценарии.
get
{
return _rows ?? (_rows = new List<Row>());
}
Стоит отметить, что это изменение, которое ReSharper отлично подходит для предложения (они называют это quick-fix).
В вашем примере он поместит небольшую кривую в оператор if
. Наведение курсора на него показывает предложение о том, как можно изменить/упростить код.
Несколько кликов позже, и это изменение реализовано.
Как это, например:
get{ return _rows ?? (_rows = new List<Row>()); }
Если вы хотите, чтобы ваш код вел себя как ваш текущий код, лениво инициализируя ваше фоновое поле при доступе к ресурсу, то да, вы можете сделать его короче. Вы можете переименовать свое фоновое поле, так как в ответе уже используется ??
, чтобы поместить все в одно выражение, и когда у вас есть это одно выражение, используйте синтаксис нового синтаксиса С# 6, чтобы избежать записи get
и return
:
List<Row>_;List<Row> Rows=>_??(_=new List<Row>());
Надеюсь, задолго до того, как вы дойдете до этого момента, вы увидите, что вы превратили простой в понимании код, который делает именно то, что вы хотите, в ужасный беспорядок, который вы никогда не захотите поддерживать.
Просто сохраните свой код в точности так, как есть. Вы можете сделать его короче, как показано, но это не делает его лучше.
Если проблема в том, что для записи требуется больше времени, потому что вы продолжаете вводить один и тот же код снова и снова, многие IDE предоставляют некоторую функцию для вставки шаблонов, фрагментов или любого другого термина, который они используют для него. Это позволяет вам определить что-то вдоль линий
{Type} {Field};
public {Type} {Property} {
get {
if ({Field} == null) {
{Field} = new {Type}();
}
return {Field};
}
}
где ваш редактор затем предложит вам указать {Type}, {Field}, {Property}, не вводя его снова каждый раз.
return _rows ?? (_rows = new List<Row>());
Если вы действительно хотели его укоротить, я просто удалю лишние скобки.
get
{
if (_rows == null)
_rows = new List<Row>();
return _rows;
}
Вы можете сделать это одним из следующих способов:
- Условный оператор (?:)
- Оператор Null-coalescing (??)
С условным оператором
get {
return _rows == null ? new List<Row>() : _rows;
}
Оператор Null-coalescing
get {
return _rows ?? new List<Row>();
}