Когда класс должен использовать свои собственные методы считывания/методы set по сравнению с доступом к участникам непосредственно?

Лучше использовать reset() формы, так как она сбрасывает состояния элементов управления формой, поэтому любой стиль проверки и ошибки сбрасываются также до первоначального исходного состояния.

13
задан Community 23 May 2017 в 10:32
поделиться

7 ответов

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

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

11
ответ дан 1 December 2019 в 23:48
поделиться

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

По-моему, это - что-то, что должно быть определено в инструкциях по кодированию.

3
ответ дан 1 December 2019 в 23:48
поделиться

Короткий ответ, "он зависит" :)

У Eric Lippert есть превосходная статья об Автоматическом по сравнению со свойствами Explicit, который занимается этой проблемой, хотя от немного отличающегося угла.

По существу вопрос, который необходимо задать:

"Из класса [является] желаемая семантика доступа к этому... свойством, отличающимся от желаемой семантики доступа к свойству с внешней стороны?"

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

3
ответ дан 1 December 2019 в 23:48
поделиться

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

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

0
ответ дан 1 December 2019 в 23:48
поделиться

Когда необходимо расширить поведение метода считывания/метода set класса, это полезно, инкапсулировали поля (методы считывания/методы set вместо прямого членского доступа). Все же в наследовании, концептуально интересно сохранить inners Вашего класса, если его подклассы не должны знать о его частном материале. Так, иногда поле является частным к реализации класса, так, чтобы даже подклассы не знали о нем.

0
ответ дан 1 December 2019 в 23:48
поделиться

Я нахожу, что делаю это время от времени - конкретно, когда я требую или сильно ожидаю, что потребую, некоторый вход в систему вокруг получения или установки (и проверка вокруг них) участников.

Я нахожу, что наличие частных/внутренних свойств действительно помогает в этих случаях.

Но я, конечно, не делаю это для любого memeber.

Последняя.NET/VS действительно помогает здесь, поскольку можно объявить свойство как таковое:

public string SomeProperty
{
get;
set;
}

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

0
ответ дан 1 December 2019 в 23:48
поделиться

Если Вы хотите, чтобы этот участник был 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;
        }
    }
}
0
ответ дан 1 December 2019 в 23:48
поделиться