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;

c#类公共属性:getter和setter在这里做正确的事情

虽然问题是关于这里的属性,但如果你看一个更抽象的层面,即在类层面,你会发现一些奇怪的东西在这里。该类用于表示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"分配一个默认值,或者必须删除第一个值构造函数。