Лучше использовать reset()
формы, так как она сбрасывает состояния элементов управления формой, поэтому любой стиль проверки и ошибки сбрасываются также до первоначального исходного состояния.
Я думаю, что это - хорошая идея, если бы Вы хотите потенциальные побочные эффекты произойти - проверка, регистрируясь и т.д. (В C#, я хотел бы смочь объявить переменную и свойство и сказать, что единственный доступ к переменной через свойство.)
Иногда можно найти, что необходимо установить переменную непосредственно точно, потому что Вы не хотите побочных эффектов. Например, Вы, возможно, должны установить две переменные вместе, и и "прежде" и "после того, как" состояния допустимы, но устанавливающий любое свойство индивидуально составил бы удар проверки.
Может быть полезно, если Вы позволяете производным классам переопределять свои методы считывания. Так, использование методов считывания даже из класса сохранит Ваш дизайн расширяемым.
По-моему, это - что-то, что должно быть определено в инструкциях по кодированию.
Короткий ответ, "он зависит" :)
У Eric Lippert есть превосходная статья об Автоматическом по сравнению со свойствами Explicit, который занимается этой проблемой, хотя от немного отличающегося угла.
По существу вопрос, который необходимо задать:
"Из класса [является] желаемая семантика доступа к этому... свойством, отличающимся от желаемой семантики доступа к свойству с внешней стороны?"
Если семантика является тем же, Ваш класс должен использовать свои собственные свойства. Если семантика будет отличаться, то Ваш класс должен будет непосредственно управлять отступающими полями.
Полезно, например, когда у Вас есть методы set, которые делают дополнительные действия как установка грязного флага или уведомление наблюдателей.
Для методов считывания Вы май вместо того, чтобы получить доступ к полю вычисляет значение при изменении представления.
Когда необходимо расширить поведение метода считывания/метода set класса, это полезно, инкапсулировали поля (методы считывания/методы set вместо прямого членского доступа). Все же в наследовании, концептуально интересно сохранить inners Вашего класса, если его подклассы не должны знать о его частном материале. Так, иногда поле является частным к реализации класса, так, чтобы даже подклассы не знали о нем.
Я нахожу, что делаю это время от времени - конкретно, когда я требую или сильно ожидаю, что потребую, некоторый вход в систему вокруг получения или установки (и проверка вокруг них) участников.
Я нахожу, что наличие частных/внутренних свойств действительно помогает в этих случаях.
Но я, конечно, не делаю это для любого memeber.
Последняя.NET/VS действительно помогает здесь, поскольку можно объявить свойство как таковое:
public string SomeProperty
{
get;
set;
}
и это эффективно создает участника позади сцены. Я знаю, что это не помогает Вам, но я думал, что это могло бы иметь некоторый интерес :-)
Если Вы хотите, чтобы этот участник был databindable или Winform или WPF, я полагаю, что необходимо объявить это как свойство. Я приблизительно на 95 процентов положителен, что привязка данных требует свойства (синтаксис метода считывания/установки). У меня есть небольшое wpf решение, которое демонстрирует это, но я не вижу способ присоединить его здесь.
Вот код: (созданный с VS 2008 SP1, будучи нацелен на .net 3.5 - я использовал Проект WPF). В проекте WPF существует 2 объекта, главное окно (window1), и объект, который мы тестируем (DataObject), существует маркировка на окне, которое связано с данными к свойству Name в экземпляре объекта данных. При преобразовании свойства Name в поле (удалите метод считывания/метод set), привязка данных прекратит работать.
Window1.xaml:
<Window x:Class="WpfDatabinding.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<Label Name ="Label1" Height="28" Margin="12,24,37,0" VerticalAlignment="Top" Content="{Binding Name}"></Label>
</Grid>
Window1.xaml.cs
using System;
using System.Windows;
namespace WpfDatabinding
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
private DataObject ADataObject;
public Window1()
{
InitializeComponent();
this.ADataObject = new DataObject();
this.ADataObject.Name = "Hello!";
this.DataContext = this.ADataObject;
}
}
}
namespace WpfDatabinding
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
private DataObject ADataObject;
public Window1()
{
InitializeComponent();
this.ADataObject = new DataObject();
this.ADataObject.Name = "Hello!";
this.DataContext = this.ADataObject;
}
}
}
DataObject.cs:
namespace WpfDatabinding
{
public class DataObject
{
// convert this to a field, and databinding will stop working
public string Name
{
get;
set;
}
}
}