c#类公共属性:getter和setter在这里做正确的事情
本文关键字:在这里 setter 正确的事 getter 属性 | 更新日期: 2023-09-27 18:07:22
我有一个类,看起来像这样;
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;
虽然问题是关于这里的属性,但如果你看一个更抽象的层面,即在类层面,你会发现一些奇怪的东西在这里。该类用于表示AccomProperty的存储库。现在有一个简单的存储库定义,它存储(由底层持久存储抽象)特定类型的对象,并允许您对这些对象执行一些操作(如访问、删除等)。所以使用像
这样的存储库var poo = new AccommPropertyRepository(1000);
var pooGUID = poo.AccommPropertyGUID;
在我的POV中不是一个好主意。因为这段代码表示您创建的存储库对象只能访问一个id为1000的特定accm属性对象,而存储库应该允许访问底层存储对象,而不仅仅是访问单个对象。一个更好的使用存储库的方法是:
var repo = new AccommPropertyRepository(repInitializationData) //initialization data can be something like conn string etc
var pooGUID = repo.GetAccommProperty(1000).GUID
这样访问GUID属性是对象的一部分,而不是存储库的一部分,因为属性是实际对象的责任,而不是存储库的责任。存储库的存在只是为了允许您访问底层的对象集。
你的setter看起来不正确。您需要在其中设置_accommpropertyguid
或将其全部移除。可以对传入的值添加验证。你需要决定是否需要属性上的setter。下面是最简单的实现:
set { _accommpropertyguid = value; }
getter对我来说看起来不错,尽管在不了解GetSingle
实现的情况下很难判断。
一般来说,使用getter应该没有副作用,并且应该快速。
我认为你应该这样做
public Guid AccommPropertyGUID
{
get
{
if(null != _accommpropertyguid)
{
var model = GetSingle(accommPropertyID);
_accommpropertyguid = model.AccommPropertyGUID;
}
return _accommpropertyguid;
}
}
这样你就不必每次都重新计算_accommpropertyguid的值
看起来不错,如果你想要一个清晰的代码,你可以删除空的set块。
但我不确定会发生什么,如果"accommPropertyID"没有分配?这里有两个构造函数第一个没有给"accommPropertyID"赋值所以你的一些函数可能会有误差。你可以使用try-catch博客必须为"accommPropertyID"分配一个默认值,或者必须删除第一个值构造函数。