我想知道如何决定在方法或类实例上创建一个对象。
下面举几个例子来澄清。我想知道如何确定如何在示例1和2之间进行选择的最佳方法。
重要:请将此视为IIS中托管的Windows服务(SVC)。
例1
public class mySvcService
{
ReusableClass rClass = new ReusableClass();
public void MethodOne()
{
//Do Method One Stuff...
rClass.doSomething();
}
public void MethodTwo()
{
//Do Method Two Stuff...
rClass.doSomething();
}
}
public class ReusableClass
{
string valueOne;
string valueTwo;
string valueThree;
public void doSomething()
{
//DoSomeWork
}
}
示例2
public class mySvcService
{
public void MethodOne()
{
ReusableClass rClass = new ReusableClass();
//Do Method One Stuff...
rClass.doSomething();
}
public void MethodTwo()
{
ReusableClass rClass = new ReusableClass();
//Do Method Two Stuff...
rClass.doSomething();
}
}
public class ReusableClass
{
string valueOne;
string valueTwo;
string valueThree;
public void doSomething()
{
//DoSomeWork
}
}
答案 0 :(得分:3)
黄金法则是尽可能将范围保持在本地。从第二个例子开始,如果你打算在任何地方使用doSomething()那么最好创建一次并具有类级别范围。如果只需要在一个方法中使用doSomething(),则在方法中本地创建对象。
答案 1 :(得分:3)
关于州的全部内容。对象是否会在两个方法调用之间保留某种状态,或者甚至在方法中保留一些状态?如果是这样,你应该保持对象存活。否则,您可以在每次调用方法时创建一个新对象,或者如果从未涉及任何状态,甚至可以使该方法保持静态。
所以:
答案 2 :(得分:0)
最好将其留在方法中。通常,它是在构造函数内部完成的。这有利于它可以将工厂用于不同的场景,或者可以轻松注入。我强烈建议将属性的职责分开,并根据需要使用它们。
答案 3 :(得分:0)
如果要将对象的范围限制为方法,可以使用"方法注入"如下所示。如果对象的范围超出了类,则可以使用其他setter和构造函数注入方法。
public interface IReusable
{
void doSomething();
}
public class Reusable: IReusable
{
public void doSomething()
{
//To Do: Some Stuff
}
}
public class mySvcService
{
private IReusable _reuse;
public void MethodOne(IReusable reuse)
{
this._reuse= reuse;
_reuse.doSomething();
}
public void MethodTwo(IReusable reuse)
{
this._reuse= reuse;
_reuse.doSomething();
}
}