首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在OOP C#中,何时、在何处、如何创建另一个类的对象?

在OOP C#中,何时、在何处、如何创建另一个类的对象?
EN

Stack Overflow用户
提问于 2018-06-05 03:54:05
回答 2查看 96关注 0票数 -2

对于我的问题,我应该在什么时候,在哪里以及如何创建一个类的对象。比如SomethingClass中的SomeOtherClass对象。

哪种方法是最好的,为什么?例如,我有一个类

代码语言:javascript
复制
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();
    }
}

或者我应该这样做?

代码语言:javascript
复制
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个用户访问同一个类,那么“性能透视图”会发生什么?或者只有一个。哪一个更好。任何有帮助的材料都会很好。有没有更好的解决方案?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-05 05:02:46

这完全取决于你想要做什么。如果你的目标是在一个类中创建另一个类的实例,那么我的方法如下:

代码语言:javascript
复制
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的示例(可能需要考虑这个)

代码语言:javascript
复制
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);
}
票数 0
EN

Stack Overflow用户

发布于 2018-06-05 04:57:23

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

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

如果new SomeOtherClass();恰好很慢并且消耗资源,那么第一个示例也会慢得多,因为每个方法调用都必须一次又一次地这样做。

相反,如果由于某种原因,每个方法都需要一个新的SomeOtherClass实例,您可以使用属性来实现:

代码语言:javascript
复制
SomeOtherClass Obj => new SomeOtherClass();

现在,您可以在如下方法中使用它:

代码语言:javascript
复制
public methodOne()
{
    Obj.someOtherClassMethodOne();
    //use object here
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50687891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档