如何确定在方法或对象上创建对象更好

时间:2016-02-23 08:50:14

标签: c# .net oop

我想知道如何决定在方法或类实例上创建一个对象。
下面举几个例子来澄清。我想知道如何确定如何在示例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
    }   
}

4 个答案:

答案 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();
     }
    }