在这个例子中它应该是实例变量还是方法变量?

时间:2016-09-28 03:09:47

标签: c#

在这个例子中,Serializer对象应该是两个方法中的实例变量还是方法变量?两种方法的优点和缺点是什么?

public class CustomerHelper
{

    private  _Serializer;
    private JavaScriptSerializer Serializer {
        get 
        {
            if (_Serializer == null) {
                _Serializer = new JavaScriptSerializer();
            }
            return _Serializer;
        }


    public Customer GetJsonLog(Customer Cust)
    {
        return GetFromLog(Serializer.Searilize(Cust));
    }

    public void WriteToLog(Customer Cust)
    {
        SaveToLog(Serializer.Searilize(Cust));
    }
}

编辑 - 忽略线程安全问题并假设将重新使用Seralizer对象。

1 个答案:

答案 0 :(得分:3)

这取决于您的用例。如果CustomHelper是长寿的,意味着它将被保留并重新使用,那么将其创建为成员属性(懒惰与否,甚至是字段,无关紧要),而不是本地作用域方法领域更好。您只需要分配一次Serializer,然后重新使用该实例。

但同样,这取决于您的用例。想象一下,如果你实例化WriteToLog方法改变了CustomHelper状态,并且它是Serializer属性的东西。您是否希望在所有后续调用中共享变异的Serializer属性?如果你想要一个新的Serializer,那么你只需要在你的方法中实例化它。

在您的示例中,CustomHelper是无状态的,我认为Serializer也是如此。如果是这种情况,则不存在问题。然而,在做出这些设计决策时要记住这一点。

作为旁注,如果CustomHelper存在很长时间,我会通过删除属性并使用私有字段来清理代码。由于它是长寿的,因此第一次实例化你将使用它的帮助程序。因此,在构造函数中实例化Serializer不会真的受到伤害。如果您在后续调用中重复使用相同的CustomHelper实例,那就更不用了。

相关问题