Поскольку многие из них объяснили техническими плюсами и минусами Properties
и Field
, пришло время перейти к примерам в реальном времени.
1. Свойства позволяют установить уровень доступа только для чтения
Рассмотрим случай dataTable.Rows.Count
и dataTable.Columns[i].Caption
. Они выходцы из класса DataTable
и оба являются для нас публичными. Разница в уровне доступа к ним заключается в том, что мы не можем установить значение dataTable.Rows.Count
, но мы можем читать и записывать dataTable.Columns[i].Caption
. Это возможно через Field
? Нет !!! Это можно сделать только с Properties
.
public class DataTable
{
public class Rows
{
private string _count;
// This Count will be accessable to us but have used only "get" ie, readonly
public int Count
{
get
{
return _count;
}
}
}
public class Columns
{
private string _caption;
// Used both "get" and "set" ie, readable and writable
public string Caption
{
get
{
return _caption;
}
set
{
_caption = value;
}
}
}
}
2. Недвижимость в PropertyGrid
Возможно, вы работали с Button
в Visual Studio. Его свойства отображаются в PropertyGrid
, как Text
, Name
и т. Д. Когда мы перетаскиваем кнопку и нажимаем на свойства, он автоматически находит класс Button
и фильтры Properties
и показывает что в PropertyGrid
(где PropertyGrid
не будет отображаться Field
, даже если они общедоступны).
public class Button
{
private string _text;
private string _name;
private string _someProperty;
public string Text
{
get
{
return _text;
}
set
{
_text = value;
}
}
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
[Browsable(false)]
public string SomeProperty
{
get
{
return _someProperty;
}
set
{
_someProperty= value;
}
}
В PropertyGrid
будут показаны свойства Name
и Text
, но не SomeProperty
. Зачем??? Потому что свойства могут принимать атрибуты . Не отображается в случае, если [Browsable(false)]
неверно.
3. Может выполнять операторы внутри свойств
public class Rows
{
private string _count;
public int Count
{
get
{
return CalculateNoOfRows();
}
}
public int CalculateNoOfRows()
{
// Calculation here and finally set the value to _count
return _count;
}
}
4. В Binding Source могут использоваться только свойства
Binding Source помогает нам уменьшить количество строк кода. Fields
не принимаются BindingSource
. Мы должны использовать Properties
для этого.
5. Режим отладки
Предположим, мы используем Field
для хранения значения. В какой-то момент нам нужно отладить и проверить, где значение становится нулевым для этого поля. Это будет трудно сделать, когда число строк кода больше 1000. В таких ситуациях мы можем использовать Property
и установить режим отладки внутри Property
.
public string Name
{
// Can set debug mode inside get or set
get
{
return _name;
}
set
{
_name = value;
}
}