1

假设我正在上课

Class ABC
 {
  public string Method1()
  {
   return "a";
  }
  public string Method2()
  {
   return "b";
  }
  public string Method3()
  {
   return "c";
  }
 }

现在我以两种方式调用此方法,例如:

ABC obj=new ABC();
Response.Write(obj.Method1());
Response.Write(obj.Method2());

其他方式

Response.Write(new ABC().Method1());
Response.Write(new ABC().Method2());

以上两种方法的输出将相同。

obj.Method1()有些人可以帮助我理解和new ABC().Method1()

提前致谢之间的区别..

4

2 回答 2

3

obj并且new ABC()是单独的实例。在您的示例中,输出是相同的,因为没有要显示的实例级数据。

试试这个看看有什么不同:

Class ABC
 {

  public string Name = "default"; 

  public string Method1()
  {
   return "a";
  }
 }

然后使用下面的代码来显示与实例级数据的区别:

ABC obj=new ABC();
obj.Name = "NewObject";
Response.Write(obj.Method1());
Response.Write(obj.Name);

Response.Write(new ABC().Method1());
Response.Write(new ABC().Name);
于 2012-07-11T17:19:17.960 回答
1

@d-stanley 想说的是,您在创建时分配内存,这是非常宝贵的资源。

更完整的答案是:创建类时考虑到一些逻辑。虽然是完全可行的Response.Write(new ABC().Method1());,但这是一个非常短的功能,并没有那么无用......当您设计时,class您实现了一些逻辑边界功能和属性。例如FileStream,有一个内部属性Stream并使其可以通过各种属性访问,您可以在重载Open()方法中设置它并在方法中销毁它Dispose()。例如,另一个类也BinaryReader实现Stream了但以不同的方式威胁它。根据您的逻辑,您可以在单个类上实现所有功能 - 某个MotherOfAllFunctions类实现了所有功能FileStream-BinaryReader但这不是一种方法。

另一点:在大多数情况下,会占用一些(或大量)内存来初始化类的一些内部逻辑——例如SqlConnection类。然后您调用Open()或任何其他方法来调用数据库 - 引入了一些非常强大的机制来支持状态机初始化、托管到取消管理的调用,并且可以执行大量代码。

实际上,您在 any 中所做的new SomeCLass().SomeMethod<int>(ref AnotherObject)是:

Response.Write( 
                 var tmpABC = new ABC();   // Constructor call . Executed always (may throw)
                 string result = tmpABC.Method1();  // Or whatever could be casted to `string`
                 tmpABC.Dispose();   // GC will kick-in and try to free memory

                 return result;
              );

如您所见 - 这与您以这种方式编写的代码相同。所以这里发生的是大量的内存分配,几乎所有这些宝贵的内存都被扔掉了。ABC()一次初始化类及其所有功能更有意义,然后任何地方使用它,从而最大限度地减少内存分配。例如 - 在 DAL 类中的每个函数调用中打开函数然后立即关闭它没有任何意义SqlConnection- 更好地声明局部变量并使其保持活动状态 - 只要应用程序线程进程存在,一些完全初始化的类就会存在。所以在这种代码风格的情况下:

public class Program
{
    private static FileStream streamToLogFile = new FileStream(...);

    public int Main(string [] args)
    {
         new Run(new Form1(streamToLogFile));
     }
}

在这个逻辑中 - 不需要保留类Form1,我内联创建了它,但所有需要访问FileStream对象(有价值的资源!)的函数将访问仅初始化一次的同一个实例。

于 2012-07-11T20:23:40.887 回答