【问题标题】:Difference between clsObject.Method() and new Class().Method()?clsObject.Method() 和 new Class().Method() 的区别?
【发布时间】:2012-07-11 17:15:30
【问题描述】:

假设我正在上课

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()之间的区别

在此先感谢..

【问题讨论】:

    标签: c# asp.net oop


    【解决方案1】:

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

    【讨论】:

    • new 关键字分配内存。 stackoverflow.com/questions/377178/…
    • @ArushKamboj:你能详细解释一下内存差异吗?
    • @D stanley:感谢您的回复。它们之间还有其他区别吗?
    • 每次使用new 时,您都在为新对象分配内存。保存该引用(例如在obj 中)保留相同的实例而不是分配新实例。在这种情况下不会有太大区别,因为没有要存储的数据,并且实例将在最后一次使用后被垃圾收集(销毁)。
    • @Gourav : No. new ABC().Method(); 等价于ABC temp = new ABC(); temp.Method();
    【解决方案2】:

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

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

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

    实际上,您在任何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() 类和它的所有功能一次然后在任何地方使用它更有意义,这样可以最大限度地减少内存over分配。例如 - 在 DAL 类中的每个函数调用中打开 SqlConnection 函数然后立即关闭它是没有任何意义的 - 更好地声明局部变量并使其保持活动状态 - 一些完全初始化的类只要应用程序线程进程就存在存在。所以在这种代码风格的情况下:

    public class Program
    {
        private static FileStream streamToLogFile = new FileStream(...);
    
        public int Main(string [] args)
        {
             new Run(new Form1(streamToLogFile));
         }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 2015-08-01
      • 2021-09-23
      • 2019-07-26
      • 1970-01-01
      • 2019-11-03
      相关资源
      最近更新 更多