C#中对象实例化的区别:在引用中存储对象与直接调用方法

C#中对象实例化的区别:在引用中存储对象与直接调用方法,c#,syntax,objectinstantiation,C#,Syntax,Objectinstantiation,我对c#中的对象声明有疑问。我用这个例子来解释 我可以这样做: MyObject obj = New MyObject(); int a = obj.getInt(); 或者我可以这样做 int a = new MyObject().getInt(); 结果是相同的,但是,这些声明之间是否存在差异?(不带语法) 谢谢。不,技术上它们是一样的 我在这个例子中只建议考虑一下,如果函数不是实际创建实例的需要,你可以考虑声明它是静态的,所以你可以简单地称之为: int a = MyObject.g

我对c#中的对象声明有疑问。我用这个例子来解释 我可以这样做:

MyObject obj = New MyObject(); 
int a = obj.getInt();
或者我可以这样做

int a = new MyObject().getInt();
结果是相同的,但是,这些声明之间是否存在差异?(不带语法)


谢谢。

不,技术上它们是一样的

我在这个例子中只建议考虑一下,如果函数不是实际创建实例的需要,你可以考虑声明它是静态的,所以你可以简单地称之为:

int a = MyObject.getInt();

但这自然取决于具体的实施。

不,技术上它们是一样的

我在这个例子中只建议考虑一下,如果函数不是实际创建实例的需要,你可以考虑声明它是静态的,所以你可以简单地称之为:

int a = MyObject.getInt();

但这自然取决于具体的实现。

这不是一个声明:它是一个类实例化

实际上并没有什么区别:这都是关于可读性和您自己的编码风格

我要补充的是,很少有情况下需要声明对某个对象的引用:当这些对象是
IDisposable

例如:

// WRONG! Underlying stream may still be locked after reading to the end....
new StreamReader(...).ReadToEnd(); 

// OK! Store the whole instance in a reference so you can dispose it when you 
// don't need it anymore.
using(StreamReader r = new StreamReader(...))
{

} // This will call r.Dispose() automatically

正如一些评论所添加的,在很多边缘情况下,实例化类并将对象存储在引用(变量)中会更好/更好,但是关于您的简单示例,我认为差异还不够,它仍然是一个编码风格/可读性问题

这不是一个声明:它是一个类实例化

实际上并没有什么区别:这都是关于可读性和您自己的编码风格

我要补充的是,很少有情况下需要声明对某个对象的引用:当这些对象是
IDisposable

例如:

// WRONG! Underlying stream may still be locked after reading to the end....
new StreamReader(...).ReadToEnd(); 

// OK! Store the whole instance in a reference so you can dispose it when you 
// don't need it anymore.
using(StreamReader r = new StreamReader(...))
{

} // This will call r.Dispose() automatically
正如一些评论所补充的,在很多边缘情况下,实例化类并将对象存储在引用(变量)中会更好/更优,但是关于您的简单示例,我认为差异还不够,它仍然是一个编码风格/可读性问题

主要是语法问题

主要区别在于,在第二个示例中不能使用MyObject的实例。而且,它可能会被立即指定为垃圾收集。

主要是语法



主要区别在于,在第二个示例中不能使用MyObject的实例。而且它可以立即被指定为垃圾回收。除了第二个示例没有留下对<代码> MyObjult<代码>实例的引用以外,没有区别。因此,它将立即成为GC的合格条件。如果不需要实例,则应该考虑制定一个方法<代码>静态< /代码>。更好的是,OP是这样问的:除了第二个示例没有留下对“代码> MyObjult/Cult>实例的引用,没有区别,所以它将立即成为GC的合格条件。如果你不需要一个实例,你应该考虑制定一个方法<代码> static 。我已经编辑了问题的标题,所以它更适合OP所问的:“没有实际的区别“如果构造函数很昂贵,而你在一个循环中实例化它们,那就有很大的区别了。@TimSchmelter好吧,我们可以把我的文章做成一篇wiki文章,记录每一个边缘案例,哈哈哈。我相信你的评论让我的回答更丰富了。谢谢你。谢谢你,Matías,这是一个非常有用的解释。@AMGHoshi顺便提一下一些建议。通常来说,说“谢谢”的方式是对你发现的每一个有用的答案进行投票,然后选择一个最适合你自己的问题。@AMGHoshi想象有20个答案,你会添加20条评论!!!更容易对每个答案进行投票,这样可以节省时间。“没有实际的区别”如果构造函数很昂贵,并且你在循环中实例化它们,这会有很大的区别。@TimSchmelter好吧,我们可以将我的帖子做成一篇维基文章,记录每一个边缘案例哈哈哈。我相信你的评论让我的回答更丰富了。谢谢你。谢谢你,Matías,这是一个非常有用的解释。@AMGHoshi顺便提一下一些建议。通常来说,说“谢谢”的方式是对你发现的每一个有用的答案进行投票,然后选择一个最适合你自己的问题。@AMGHoshi想象有20个答案,你会添加20条评论!!!你能向我解释一下在这种情况下,de GC是什么吗?@AMGHoshi简短回答:GC是垃圾收集。GC进程将从内存中删除代码中不再引用的对象的实例。这可能会立即发生,但最有可能发生在未来的不确定时刻。长答案:见MSDN。非常感谢,我会看到的。你能向我解释一下这个例子中的de GC是什么吗???@AMGHoshi短答案:GC是垃圾收集。GC进程将从内存中删除代码中不再引用的对象的实例。这可能会立即发生,但最有可能发生在未来的不确定时刻。详细回答:见MSDN。非常感谢,我会看的。