直接访问成员变量vs通过属性

时间:2009-11-16 19:49:08

标签: design-patterns .net-3.5 oop c#-3.0

我问这个问题的表现是主要关注点。但我想知道这两种方法的其他可能的优点/缺点。

问题是:由于属性转换为IL中的方法,如果调用属性而不是直接访问字段(从类中),是否会有显着的性能损失?

我正在设计一个转换类(PersonalizationConstructor),其目的是从IDataReader“构造域实体”。

我想在这个类的构造函数(PersonalizationConstructor)中接受IDataReader并保护虚拟属性以从IDataReader记录集返回数据;像:

protected virtual string ProductFilterCriteria
{
    get;
    set;
}

我可以在一个类中为此实现提供15个以上的属性。这样,在从记录集访问之前,可以覆盖属性以检查记录集是否具有“XXX”字段(我不希望将此检查作为所有的默认实现)。

在一个类中有15个以上的虚拟属性是否适合实现上述情况?


请不要过多关注IDataReader。我主要担心的是:

由于属性转换为IL中的方法,如果调用属性而不是直接(从类中)访问字段,是否会有明显的性能惩罚?

我会有这样的事情:

class MainSite
{
    protected virtual string ProductFilterCriteria
    {
        get
        {           
            return _source["ProductFilterCriteria"];
        }
    }

    protected virtual string Abc
    {
        get
        {
            return _source["Abc"];
        }
    }

    protected virtual string Def
    {
        get
        {
            return _source["Def"];
        }
    }

    ..... many properties
}

class VirtualSite : MainSite
{
    protected override string ProductFilterCriteria
    {
        get
        {
            return null;
        }
    }
}

3 个答案:

答案 0 :(得分:2)

与以往一样,在根据性能做出设计决策之前 - 测量它!

假设数据来自关系数据库,我强烈怀疑查询本身(以及相关的转换,网络IO等)将主导性能。

JIT无法内联虚拟属性调用,但如果使用虚拟属性的原因是不同的实现可能需要做不同的事情,那么你真的没有无论如何都可以使用直接现场访问。

我不想说你的设计是否合适 - 我们没有足够的信息 - 但如果你认为这是实现你所需要的最可读的方式,那么建立一个原型并测量其性能在偏离该设计之前。

答案 1 :(得分:1)

设置或检索使用C#3.0属性语法实现的属性,或者使用字段支持的旧式属性,可以(但不一定会)通过JIT优化。这意味着在这方面的任何优化都是无法衡量的,甚至可能适得其反。

您所说的是采用类类型的属性(而不是像int float这样的基本类型。这些类(ctor)的开销或花在做完全不同的事情上的时间(你提到IDataReader,我假设读取数据,这是昂贵的)比你可能的1或2μ-ops大得多通过从一个地方改为另一个地方安全我得到的是:即使是0.001%的利润也是如此。

换句话说:虽然在非常罕见的情况下,你处于内循环并且必须每微秒挤出一次,你可以重新考虑这个选择。在任何其他情况下:使用gettors / settors。

PS:读这个q的另一个答案。让我觉得我可能会误解。如果是这样,请发表评论

编辑:Jon S.提到虚拟属性没有被优化掉,这是正确的。但是,无论

,小额利润的故事情节仍然存在

答案 2 :(得分:1)

您可能希望接受IDataRecord而不是IDataReader,因为这是描述您将关注的DataReader部分的“基本类型”。

否则,我会使用属性。会没事儿的。我不会将它们标记为“虚拟”。赔率是这种类型并不是真正意图继承,如果是这些属性可能不应该被触及。