Хотя можно получить значение поля и установить поле, поля позволяют сделать пару вещей, которые нельзя сделать со свойствами:
- Можно изменить значение поля таким образом, чтобы новое значение зависело от старого значения в точный момент изменения. Эта семантика отличается от чтения свойства, вычисления нового значения и его обратной записи.
- Можно передать поле посредством ссылки на методы, которые затем могут свободно выполнять любую последовательность операций чтения и записи, которую они считают нужными, при этом такие операции чтения или записи происходят "вживую". Опять же, это имеет другую семантику от передачи копии свойства методу, получения модифицированной копии обратно от метода и сохранения этой измененной копии обратно в оригинал.
Если бы кто-то хотел выставить свойство таким образом, чтобы можно было делать с ним «похожие на поля» вещи, но без экспонирования фактического поля можно было бы иметь семейство общих методов UseProperty, объявленных как:
delegate TResult; FuncRef<T1, TResult>(ref T1);
ResultType UseProperty<ResultType>
(FuncRef func)
{return func(_field);}
delegate TResult; FuncRef(ref T1 p1, ref T2 p2>
ResultType UseProperty<ResultType, T1>
(FuncRef<propertyType, T1, ResultType> func, ref T1 p1)
{return func(_field, p1);}
delegate TResult; FuncRef(ref T1 p2, ref T2 p2, ref T3 p3>
ResultType UseProperty<ResultType, T1, T2>
(FuncRef<propertyType, T1, T2, ResultType> func, ref T1 p1, ref T2 p2)
{return func(_field, p1, p2);}
К сожалению, нет хорошего способа объявить семейство таких функций в C # или vb (то есть «универсальная» функция, которая будет принимать любое количество параметров «ref» и делать их доступными для вызываемого кода). Слишком плохо, поскольку в противном случае при некоторой языковой поддержке такой подход мог бы обеспечить очень хорошую парадигму для контроля доступа к информации (то есть он мог подготовиться к изменению определенной информации, позволить общему коду изменять информацию, а затем воздействовать на измененную информацию). информация, без необходимости создания каких-либо новых экземпляров объекта).