在你调用方法的同一行上实例化一个类是不好的做法吗?

时间:2012-12-05 16:05:55

标签: .net memory-management garbage-collection

如果我只需要实例化一个类来调用它上面的单个方法然后完成它,我喜欢在一行中这样做,

string result = new MyClass().GetResult();

而不是做类似的事情,

var myClass = new MyClass();
string result = myClass.GetResult();

据我所知,在内存分配和后续清理方面,幕后工作也是如此。这是真的如此,还是有区别?如果是这样,一个比另一个更有效吗?

修改

像许多人建议的那样使方法保持静态是一个很好的解决方案。我正在与其他人创建的课程一起工作,目前我无法重构或更改。那么对于这种情况,实例化内联或单独一行是否有任何区别?

修改

这个问题的答案是否会根据班级维护的资源数量而有所不同(来自Blam& BenCr的评论)?

3 个答案:

答案 0 :(得分:4)

使用单行程序实际上应该更有效率,因为运行时只有一个较少的局部变量来跟踪垃圾收集的目的。 编辑:不正确,请参阅下面的Adam的回复。我的原始观点仍然坚定,强烈,效果(如果有的话)应该可以忽略不计。

但真正的问题是:为什么GetResult()不是静态函数?这样可以完全避免整个实例化。

答案 1 :(得分:3)

我无法在C# coding conventions.

中看到有关您问题的任何内容

我个人的偏好是你给出的后一个例子。我认为它可以提高代码的可读性。

但是,如果您要实例化一个类只是为了从中获取单个值,那么重新考虑该类的设计方式可能会更好。你的GetResult()方法应该是静态的吗?

答案 2 :(得分:0)

这仅适用于类实现IDisposable的情况 如果您正在寻找有效使用单一方法的方法,那么两者都没有 MyClass()在超出范围之前不会被处置。

using (myClass = new MyClass()) 
{
    string result = myClass.GetResult();
}

using Statement (C# Reference)

考虑静态方法和类

Static Classes and Static Class Members (C# Programming Guide)

垃圾收集是一个广泛的话题 您声明它不是您的代码,但如果您编写包含资源的代码,则需要一些指导。

IDisposable Interface