对于我的问题,我何时,何地以及如何创建一个类的对象。在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个用户访问同一个班级会有什么“性能视角”?或者只是一个。哪一个更好。任何帮助材料都会很好。有更好的解决方案吗?
答案 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);
}