我在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
绑定到Endpoint
或anotherEndpoint
?
不知何故,我认为这是第一次,这将是有意义的,并且有用,但我会感谢一些澄清。
答案 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
的地址。