【问题标题】:Do I need to store a class in a variable to access it's non static methods?我是否需要将类存储在变量中才能访问它的非静态方法?
【发布时间】:2019-11-28 14:27:10
【问题描述】:

可以吗

new Class().Methodname()

当我不再需要该对象时,还是这样做更好

var class = new Class();
class.Methodname();

【问题讨论】:

  • 您对更好的定义是什么?
  • 与“什么更好?使用字符串 x = ""; 或使用字符串 x = "";" 相同的定义也许第一种方式会破坏存储
  • 它们本质上是一样的,唯一真正的区别是在第二个例子中你存储了对创建对象的引用,而在第一个例子中你没有。这样做的唯一原因是如果您希望访问类对象上的其他元素。如果它是一个经常被这样调用的方法,那么最好将其改为静态方法。
  • 如果可以在方法完成的那一刻丢弃新创建的实例,最好将方法设计为静态方法。如果那是你调用的库方法,那么这个库就好像设计得很糟糕一样。

标签: c# class


【解决方案1】:

可以吗

嗯,这取决于。无论哪种方式,您的程序都可以工作,并且在编译发布时生成的 IL(基本上)是相同的。问题是,如果该方法显然不依赖于 Class 的任何实际状态,为什么该方法不是 static

通常,如果您发现自己创建了一个新实例并在之后直接放弃它只是因为您需要调用它的方法,这至少是一个很好的迹象,表明该类没有正确建模。

void Main()
{
    var x = new MyClass().Do();
    var z = new MyClass();
    var y = z.Do();
}

public class MyClass
{
    public string Do() => "hello";
}

Release 配置下编译,结果如下:

IL_0000:  newobj      UserQuery+MyClass..ctor
IL_0005:  call        UserQuery+MyClass.Do
IL_000A:  pop         
IL_000B:  newobj      UserQuery+MyClass..ctor
IL_0010:  callvirt    UserQuery+MyClass.Do
IL_0015:  pop         
IL_0016:  ret       

MyClass.Do:
IL_0000:  ldstr       "hello"
IL_0005:  ret         

MyClass..ctor:
IL_0000:  ldarg.0     
IL_0001:  call        System.Object..ctor
IL_0006:  ret         

有关差异的更多信息(callcallvirt),请参阅 e。 G。 this question.

【讨论】:

    【解决方案2】:

    在性能方面,我认为两种方法之间没有太大区别。

    第二种方法给你更多的可读性和可维护性

    【讨论】:

      【解决方案3】:

      这取决于。就像 Germi 所说的那样,它表明存在设计缺陷。但进一步,如果该类实现了 idisposable,您应该在 try finally 块的上下文中使用它或使用:

      using(var class = new Class())
      {
         class.Methodname();
      }
      

      以确保它被处置并释放它所拥有的任何资源。

      【讨论】:

        猜你喜欢
        • 2015-02-18
        • 2016-07-02
        • 1970-01-01
        • 2012-07-17
        • 1970-01-01
        • 2017-01-13
        • 2013-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多