Свойства C#3.0 Automatic, почему не получают доступ к полю непосредственно?

Я бы сделал следующее:

var arr = [1,2,3,4],
    brr = [2,4],
    res = arr.filter(f => !brr.includes(f));
console.log(res);

12
задан Jon Skeet 29 October 2008 в 17:19
поделиться

9 ответов

Две из больших проблем с прямым доступом к переменной в классе (поле/атрибут):

1) Вы не можете легко связать с данными против полей.

2) При представлении общедоступных полей от классов, Вы не можете позже изменить их на свойства (например: добавить логику проверки к методам set)

30
ответ дан 2 December 2019 в 03:12
поделиться

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

3
ответ дан 2 December 2019 в 03:12
поделиться

Поскольку, в будущем при изменении реализации код с помощью текущего интерфейса не повредится.

Например, Вы реализуете простой класс с общедоступным полем и начинаете использовать свой класс в некоторых внешних модулях. Месяц спустя Вы обнаруживаете, что необходимо реализовать ленивую загрузку в том классе. Необходимо было бы затем преобразовать поле к свойству. От внешней точки модуля ciew это могло бы выглядеть одинаково syntaxicaly, но это не. Свойство является рядом функций, в то время как поле является смещением в экземпляре класса.

При помощи свойства Вы эффективно снижаете риск, который изменит интерфейс.

14
ответ дан 2 December 2019 в 03:12
поделиться

Этот стиль нотации более полезен при смешивании доступности для метода get и метода set. Например, можно записать:

public int Foo { get; private set; }

Вы могли также поместить внутренний метод set или даже сделать метода get частным и общественность метода set.

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

2
ответ дан 2 December 2019 в 03:12
поделиться

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

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

1
ответ дан 2 December 2019 в 03:12
поделиться

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

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

0
ответ дан 2 December 2019 в 03:12
поделиться

Я думаю, что корреспондент просит, почему бы не следующее...

public string FirstName { }

Почему беспокойство со средствами доступа, когда Вы могли сократить его к вышеупомянутому. Я думаю, что ответ - то, что путем требования средств доступа делает это очевидным для человека, читающего код, что это - стандарт, получают/устанавливают. Без них Вы видите выше его, твердо определить, это автоматически реализуется.

0
ответ дан 2 December 2019 в 03:12
поделиться

Для 99% случаев, представляя общедоступное поле прекрасен.

общий совет состоит в том, чтобы использовать поля: "Если Вы представляете общедоступные поля от своих классов, Вы не можете позже изменить их на свойства". Я знаю, что все мы хотим, чтобы наш код соответствовал требованиям завтрашнего дня, но существуют некоторые проблемы с этими взглядами:

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

  • 99% Ваших элементов данных никогда не должны будут становиться нетривиальными свойствами. Это спекулятивная общность . Вы пишете много кода, который будет проребенок никогда не быть полезным.

  • , Если Вам нужна двоичная совместимость через версии, делая элементы данных в к свойствам, вероятно, не достаточно. По крайней мере необходимо только представить интерфейсы и скрыть всех конструкторов и представить фабрики (см. код ниже).

<час>
public class MyClass : IMyClass
{
    public static IMyClass New(...)
    {
        return new MyClass(...);
    }
}

Это - тяжелая проблема, пытаясь сделать код, который будет работать в неопределенном будущем. Действительно трудно.

у кого-либо есть пример времени, когда использование тривиальных свойств убралось подобру-поздорову?

0
ответ дан 2 December 2019 в 03:12
поделиться

Это сохраняет инкапсуляцию объекта и уменьшает код, чтобы быть более простым читать.

-1
ответ дан 2 December 2019 в 03:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: