我有一个程序设计如下:
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),两者之间有什么区别;

解决方案 »

  1.   

    1.
    不必.直接Socket a1=b1,无论你是否new socket,a1的值最终都是b1,使用new socket(),反而需要分配资源,而这个创建的socket,你连用都没有用过,明显是多余的.
    2.
    你的判断是对的,a1关闭,对于类的传参实际传的是地址,所以vara与a1引用的是同一个对象,当然也会关闭.
    3.
    没有必要,道理在第2点中已经说明,类的传参实际是传地址.
      

  2.   

    楼上已经很清楚了 
    ref 用于结构体的多
      

  3.   

    1、在funcA函数中a1赋值前要不要用new   socket,还是直接用Socket   a1=b1;请问两者之间有什么区别; 
    --------------
    随个人喜好.这两个写法的功能和后台调用效果都完全一致.没什么区别.当你用一个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是引用类型,本身传递的就是地址.所以其两种写法之法也没有什么区别.