在这个例子中,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对象。
答案 0 :(得分:3)
这取决于您的用例。如果CustomHelper
是长寿的,意味着它将被保留并重新使用,那么将其创建为成员属性(懒惰与否,甚至是字段,无关紧要),而不是本地作用域方法领域更好。您只需要分配一次Serializer,然后重新使用该实例。
但同样,这取决于您的用例。想象一下,如果你实例化WriteToLog
方法改变了CustomHelper
状态,并且它是Serializer
属性的东西。您是否希望在所有后续调用中共享变异的Serializer
属性?如果你想要一个新的Serializer,那么你只需要在你的方法中实例化它。
在您的示例中,CustomHelper
是无状态的,我认为Serializer
也是如此。如果是这种情况,则不存在问题。然而,在做出这些设计决策时要记住这一点。
作为旁注,如果CustomHelper
存在很长时间,我会通过删除属性并使用私有字段来清理代码。由于它是长寿的,因此第一次实例化你将使用它的帮助程序。因此,在构造函数中实例化Serializer不会真的受到伤害。如果您在后续调用中重复使用相同的CustomHelper
实例,那就更不用了。