Свойства представляют поля. Поля должны (почти всегда) быть сохраненными частными к классу и получили доступ через, получают и устанавливают свойства. Свойства обеспечивают уровень абстракции, разрешающей Вам изменить поля, не влияя на внешний путь к ним получают доступ вещи, которые используют Ваш класс.
public class MyClass
{
// this is a field. It is private to your class and stores the actual data.
private string _myField;
// this is a property. When accessed it uses the underlying field,
// but only exposes the contract, which will not be affected by the underlying field
public string MyProperty
{
get
{
return _myField;
}
set
{
_myField = value;
}
}
// This is an AutoProperty (C# 3.0 and higher) - which is a shorthand syntax
// used to generate a private field for you
public int AnotherProperty{get;set;}
}
@Kent указывает, что Свойства не требуются, чтобы инкапсулировать поля, они могли сделать вычисление на других полях или служить другим целям.
@GSS указывает, что можно также сделать другую логику, такую как проверка, когда к свойству получают доступ, другая полезная функция.
Я видел, как этот случай всплывал в ISO встреча, поскольку это нарушило некоторые реализации макроса offsetof () (LWG 273). Решение: & reinterpret_cast
Я определяю эту служебную функцию:
template<typename T>
T *GetRealAddr(T &t)
{ return reinterpret_cast<T*>(&reinterpret_cast<unsigned char &>(t)); }