Публичное свойство класса C #: правильно ли здесь работает getter и setter? - PullRequest
0 голосов
/ 04 сентября 2011

У меня есть класс, который выглядит следующим образом:

public class AccommPropertyRepository : IAccommPropertyRepository {

    public AccommPropertyRepository() { 
    }

    public AccommPropertyRepository(int _accommPropertyID) {
        accommPropertyID = _accommPropertyID;
    }

    private readonly int accommPropertyID;
    private Guid _accommpropertyguid;

    public AccommProperty GetSingle(int id) { 

      //Logic sits here and returns single AccommProperty class

    }

    public Guid AccommPropertyGUID {

        get {

            var model = GetSingle(accommPropertyID);
            _accommpropertyguid = model.AccommPropertyGUID;

            return _accommpropertyguid;
        }
        set {
        }
    }

}

Как вы можете видеть, есть публичное свойство с именем AccommPropertyGUID.Я проверил код, он возвращает то, что должен, но я не уверен, что мой код написан правильно.

Реализовал ли я эту структуру прямо здесь?

ОБНОВЛЕНИЕ:

Моя цель здесь - иметь возможность вызывать этот класс следующим образом;

var poo = new AccommPropertyRepository(1000);
var pooGUID = poo.AccommPropertyGUID;

Ответы [ 4 ]

4 голосов
/ 04 сентября 2011

Хотя вопрос здесь о свойствах, но если вы посмотрите на более абстрактный уровень, то есть на уровень класса, вы найдете здесь что-то странное.Класс используется для представления репозитория для AccommodationProperty.Теперь простое определение репозитория, в котором он хранит (абстрагируется базовым постоянным хранилищем) определенный тип объектов и позволяет выполнять некоторые операции (например, доступ, удаление и т. Д.) Над этими объектами.Поэтому использование репозитория типа

var poo = new AccommPropertyRepository(1000);
var pooGUID = poo.AccommPropertyGUID;

не очень хорошая идея в моем POV.Поскольку этот код обозначает, что вы создаете объект репозитория для доступа только к одному конкретному объекту свойства размещения, который имеет идентификатор 1000, где в качестве репозитория должен быть разрешен доступ к нижележащим хранимым объектам, а не только к одному объекту.Лучшим способом использования репозитория было бы что-то вроде:

var repo = new AccommPropertyRepository(repInitializationData) //initialization data can be something like conn string etc
var pooGUID = repo.GetAccommProperty(1000).GUID

Таким образом, доступ к свойству GUID является частью объекта, а не репозитория, поскольку свойство является ответственностью фактического объекта, а не репозитория.Хранилище предназначено только для того, чтобы вы могли получить доступ к базовым наборам объектов.

Надеюсь, это имеет смысл.

2 голосов
/ 04 сентября 2011

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

set { _accommpropertyguid = value; } 

Геттер выглядит нормально для меня, хотя, не зная больше о реализации GetSingle, трудно сказать.

В целом, использование геттера не должно иметь побочных эффектов и должно быть fast .

0 голосов
/ 04 сентября 2011

Я думаю, вы должны сделать это вместо этого

public Guid AccommPropertyGUID 
{
    get 
    {
         if(null != _accommpropertyguid)
             {
                 var model = GetSingle(accommPropertyID);
                 _accommpropertyguid = model.AccommPropertyGUID;
             }

          return _accommpropertyguid;
    }
}

Таким образом, вам не придется каждый раз пересчитывать значение _accommpropertyguid

0 голосов
/ 04 сентября 2011

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

Но я не уверен в том, что произойдет, если не будет назначен "admmPropertyID"?У вас есть 2 конструктора, а первый не имеет никакого присваивания для "admmPropertyID", так что некоторые из ваших функций могут выдавать ошибку.Вы можете использовать блоги try-catch, или вам нужно назначить значение по умолчанию для "admmPropertyID", или вы должны удалить первый конструктор.

...