我有一个程序设计如下:
void funcA()
{
Socket a1 = new Socket();
a1=b1;
//b1是已经建立的socket的连接;
d1 e1=new d1(a1);
Thread c1= new Thread(new ThreadStart(d1.funcB));
c1.IsBackground = true;
c1.Start();
}
class d1
{
socket vara;
public d1(socket varb)
{
vara=varb;
}
void funcB()
{
vara.receive(1024);
//...
//...
vara.close();
}
}
小弟有在以上的程序片段中有3个问题
1、在funcA函数中a1赋值前要不要用new socket,还是直接用Socket a1=b1;请问两者之间有什么区别;
2、在funcA函数中调用了c1.Start();之后若我再写a1.close(),会不会在线程中vara也同时关闭了,为什么;
3、要不要在public d1(socket varb)写成public d1(ref socket varb),在funcA中调用d1 e1=new d1(a1)改为d1 e1=new d1(ref a1),两者之间有什么区别;
void funcA()
{
Socket a1 = new Socket();
a1=b1;
//b1是已经建立的socket的连接;
d1 e1=new d1(a1);
Thread c1= new Thread(new ThreadStart(d1.funcB));
c1.IsBackground = true;
c1.Start();
}
class d1
{
socket vara;
public d1(socket varb)
{
vara=varb;
}
void funcB()
{
vara.receive(1024);
//...
//...
vara.close();
}
}
小弟有在以上的程序片段中有3个问题
1、在funcA函数中a1赋值前要不要用new socket,还是直接用Socket a1=b1;请问两者之间有什么区别;
2、在funcA函数中调用了c1.Start();之后若我再写a1.close(),会不会在线程中vara也同时关闭了,为什么;
3、要不要在public d1(socket varb)写成public d1(ref socket varb),在funcA中调用d1 e1=new d1(a1)改为d1 e1=new d1(ref a1),两者之间有什么区别;
不必.直接Socket a1=b1,无论你是否new socket,a1的值最终都是b1,使用new socket(),反而需要分配资源,而这个创建的socket,你连用都没有用过,明显是多余的.
2.
你的判断是对的,a1关闭,对于类的传参实际传的是地址,所以vara与a1引用的是同一个对象,当然也会关闭.
3.
没有必要,道理在第2点中已经说明,类的传参实际是传地址.
ref 用于结构体的多
--------------
随个人喜好.这两个写法的功能和后台调用效果都完全一致.没什么区别.当你用一个socket对象去初始化一个socket对象时,他默认的就是去调用根据现有对象建立新对象的构造函数.听着有点绕口.不过根本的一点就是他们所表达的意义完全一致.
2、在funcA函数中调用了c1.Start();之后若我再写a1.close(),会不会在线程中vara也同时关闭了,为什么;
---------------------------------
参考楼1楼的回答3、要不要在public d1(socket varb)写成public d1(ref socket varb),在funcA中调用d1 e1=new d1(a1)改为d1 e1=new d1(ref a1),两者之间有什么区别;
----------
你所传递的socket是引用类型,本身传递的就是地址.所以其两种写法之法也没有什么区别.