澄清调用new thisThing()时会发生什么

时间:2014-01-30 06:30:28

标签: c# .net object pointers garbage-collection

我在C和汇编程序中开始了我的第一个真正的编码,所以我对c#中的构造函数效果有疑问:

class generator()
{
    TcpClient some = new TcpClient(Endpoint);
    while(!some.connected);
    user other = new user(some);
    some = new TcpClient(anotherEndpoint);
}

class user(TcpClient cli)
{
    localTcpclient = cli; //localTcpclient will be stored and used in the future
}

现在:
是否打电话

  

sth = new whatev();

在堆中创建whatev 某处的新实例并将其与sth关联,或者是放置在上一个对象之前的新对象?

即。将other.localTcpclient绑定到EndpointanotherEndpoint
不知何故,我认为这是第一次,这将是有意义的,并且有用,但我会感谢一些澄清。

1 个答案:

答案 0 :(得分:2)

  

打电话   sth = new whatev();   在堆中的某个地方创建一个新的whatev实例并将其与sth ...?

相关联

是的,那是真的。你可以想象这就好像写作

whatev* sth = new whatev();

在C ++中。多次调用此语句不会覆盖whatev对象占用的内存,而是会创建越来越多的whatev实例。 C#变量很明显(在ref类型的情况下)处理引用到堆上的对象。但与C ++中的引用不同,它们的目标(即引用的对象)可以更改,与指针不同,如果句柄不再引用它们,则引用的对象将用于垃圾回收。

在您的情况下,other.localTcpclient确实引用了先创建的TcpClient(Endpoint)。那是因为引用,即对象在堆上的地址,被复制到localTcpclient。之后some会发生什么与other无关,因为它仍然包含原始TcpClient的地址。