何时以及如何在OOP C#中创建另一个类的对象?

时间:2018-06-04 19:54:05

标签: c# oop object

对于我的问题,我何时,何地以及如何创建一个类的对象。在SomethingClass中说SomeOtherClass对象。

哪种方法最好,为什么?例如,我有一个班级

public class SomethingClass()
{
    SomeOtherClass obj;
    public SomethingClass()
    {
         obj = null;
    }
    public void methodOne()
    {
        obj = new SomeOtherClass();
        obj.someOtherClassMethodOne();
    }
    public void methodTwo()
    {
        obj = new SomeOtherClass();
        obj.someOtherClassMethodTwo();
    }
}

或者我应该这样做?

public class SomethingClass()
{
    SomeOtherClass obj;
    public SomethingClass()
    {
      obj = new SomeOtherClass();
    }
    public methodOne()
    {
        obj.someOtherClassMethodOne();
        //use object here
    }
    public methodTwo()
    {
        obj.someOtherClassMethodTwo();
        //use object here
    }
}

如果当时有10个用户访问同一个班级会有什么“性能视角”?或者只是一个。哪一个更好。任何帮助材料都会很好。有更好的解决方案吗?

2 个答案:

答案 0 :(得分:0)

正如已经说过的那样,它在很大程度上取决于用例。如果所有这些类都很简单并且内部没有任何资源消耗机制,那么在大多数情况下,这两个示例之间的性能差异应该可以忽略不计。

但是,不可忽视的是,将来更改和维护代码的难度是多大。第一种情况是一个很好的例子,如何不这样做,因为现在你必须记住每个方法中的new SomeOtherClass(),最终,你将忘记这样做,导致空引用异常。构造函数通常会以完全有效的状态返回类的实例,这包括以某种方式初始化所有字段。

如果new SomeOtherClass();恰好是缓慢且耗费资源,第一个示例也会慢得多,因为每次方法调用都必须一次又一次地执行。

相反,如果出于某种原因,每个方法都需要SomeOtherClass的新实例,则可以使用属性来执行此操作:

SomeOtherClass Obj => new SomeOtherClass();

现在你可以在这样的方法中使用它:

public methodOne()
{
    Obj.someOtherClassMethodOne();
    //use object here
}

这样,每次有东西引用Obj时,都会创建SomeOtherClass的新实例,而不是重用旧实例。

答案 1 :(得分:0)

这一切都取决于你想要做什么。如果你的目标是在一个类中创建另一个类的实例,那么我在下面是如何做到的:

class Program
{
    static void Main(string[] args)
    {
        SomethingClass somethingClass = new SomethingClass();
        somethingClass.PrintThisText("HEY THERE");
        //even though I'm calling .`PrintThisText` method here, this method will in turn call the `PrintText` method in `SomeOtherClass`
    }
}

public class SomethingClass
{
    readonly SomeOtherClass _someOtherClass;
    public SomethingClass ()
    {
        this._someOtherClass = new SomeOtherClass();
    }
    public void PrintThisText(string text)
    {
        this._someOtherClass.printText(text);
    }
}

public class SomeOtherClass
{
    public void printText (string text)
    {
        Console.WriteLine(text);
    }
}

以下是使用Interface的示例(可能需要考虑这个)

class Program
{
    static void Main(string[] args)
    {
        SomethingClass somethingClass = new SomethingClass(new SomeOtherClass());
        somethingClass.doSomething("HEY THERE");

    }
}


public class SomethingClass
{
    DoStuff _doStuff;
    public SomethingClass(DoStuff doStuff)
    {
        this._doStuff = doStuff;
    }

    public void doSomething(string stuff)
    {
        _doStuff.PrintText(stuff);
    }
}

public class SomeOtherClass : DoStuff
{
    public void PrintText(string text)
    {
        Console.WriteLine("HEY THERE");
    }
}

public interface DoStuff
{
    void PrintText(string text);
}