【问题标题】:When where and how shall I create object of another class in OOP C#?何时以及如何在 OOP C# 中创建另一个类的对象?
【发布时间】:2018-06-04 19:54:05
【问题描述】:

对于我的问题,我应该何时、何地以及如何创建一个类的对象。在 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 个用户访问同一个类,“性能方面”会发生什么?或者只是一个。哪一个更好。任何帮助材料都会很好。有没有更好的解决办法?

【问题讨论】:

  • 在这个例子中,性能在这里没有任何实际影响。这完全取决于您的使用环境。构造函数的目的是在调用方法或道具之前按照需要的方式设置该类……因此您可以在构造函数中创建“obj”的新实例,这很好且有效。在方法(一、二等)中执行此操作也很好,但您需要事先检查 null 并且调用的顺序可能很重要,具体取决于您的用例。我选择构造函数初始化/创建
  • 还有一个问题先生,在第一个示例中,它是早期绑定,在第二个示例中,它是晚期绑定。对吗?
  • @ITQ 在第一个例子中说它是无麸质的,而在另一个例子中是吸血蝙蝠。你编造一些关于术语可能意味着什么的富有想象力的故事,而不是真正阅读真实的文档并找出答案,这对自己造成了极大的伤害。
  • 您不需要学习 C# - 先尝试阅读有关面向对象编程的知识。

标签: c# oop object


【解决方案1】:

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

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);
    }
}

这是一个使用接口的例子(可能要考虑这个)

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);
}

【讨论】:

  • 为什么在第一个示例中使用只读?我真的很需要这种东西。
  • readonly 用于防止其他程序员在设置变量后更改其值。
  • 如果它回答了您的问题,您可以通过将其标记为答案来关闭它
【解决方案2】:

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

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

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

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

SomeOtherClass Obj => new SomeOtherClass();

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    相关资源
    最近更新 更多