请高手回答一个用object作为函数参数的问题??
有一个主函数myMain(),这个函数中定义了一个类myData的对象myObj,对象中含有一些int,double,string等数据,我将myObj赋值给一个obje...
有一个主函数myMain(),这个函数中定义了一个类myData的对象myObj,对象中含有一些int,double,string等数据,我将myObj赋值给一个object对象para,然后将para作为参数传给了新线程TestThread调用的方法newMethod,语句如下:
object para=myObj;
Thread TestThread = new Thread(new ParameterizedThreadStart
(newMethod) );
TestThread.Start(para);
然后我在newMethod函数中,将para还原成类myData的对象:
myData d=(myData)para;
这样,主函数myMain()中myObj的数值就被传递到子函数newMethod中了。
我看到书上说object对象作为函数参数是以引用的方式!那么,newMethod函数使用的d是不是和主函数myMain()中的myObj对象是同一个内存单元??如果我在执行子进程的时候,主进程执行完毕,释放了myObj对象,那么子进程中的d对象岂不是消失了??这还了得??
iceser,您的意思是:
如果我在执行子进程的时候,主进程执行完毕,释放了myObj对象,那么子进程中的d对象不会消失的,可以继续使用d对象,是吗?? 展开
object para=myObj;
Thread TestThread = new Thread(new ParameterizedThreadStart
(newMethod) );
TestThread.Start(para);
然后我在newMethod函数中,将para还原成类myData的对象:
myData d=(myData)para;
这样,主函数myMain()中myObj的数值就被传递到子函数newMethod中了。
我看到书上说object对象作为函数参数是以引用的方式!那么,newMethod函数使用的d是不是和主函数myMain()中的myObj对象是同一个内存单元??如果我在执行子进程的时候,主进程执行完毕,释放了myObj对象,那么子进程中的d对象岂不是消失了??这还了得??
iceser,您的意思是:
如果我在执行子进程的时候,主进程执行完毕,释放了myObj对象,那么子进程中的d对象不会消失的,可以继续使用d对象,是吗?? 展开
展开全部
1、
.net 的所有对象,都是从object类继承而来的,也就是说,当然这个是由IDE自动完成的。也就是说,任何类型,都是object的派生类,所以,不需要像
object para = myObj; 这样的代码出现,
在需要 object 类型的参数时,直接使用 myObj 即可。因为派生类可以隐式转换为它的基类。
2、
object对象作为函数参数时,并不都是使用引用方式,那要看具体的object对象的原型是什么,也可以是值类型。比如当object为int, uint, byte, string, Guid 等类型时,是进行值拷贝的,并不只是传递一个引用。对于C#的对象变量,我更倾向于它是一个指针,虽然.net貌似在非安全代码时没有所谓的指针。但除了值类型之外,我想其它的类型实例,它们的特点更像指针。
3、
GC的问题。也就是所谓的对象释放问题。首先,GC不是实时回收的,也就是说,当一个对象应当被释放时,GC很有可能不是在第一时间释放它,出于工作效率等各方面考虑,GC一般是定期回收内存的,或者也可以手用调用GC的相关函数才显示回收。同时,GC在回收内存是,有一定的标准,在这个标准里面,作用域就显得不是那么重要了,就算一个对象超出了定义它的代码所在的使用域,但同时如果还有其它变量引用它的话,GC就会认为该对象还在使用,并不会释放和回收它的。GC内部应该使用了一种类似引用计数器的设计,如果对象引用计数器不为零,那就不会释放该对象,这点有点像COM。你看过COM的机制的话,应该就会明白了。
.net 的所有对象,都是从object类继承而来的,也就是说,当然这个是由IDE自动完成的。也就是说,任何类型,都是object的派生类,所以,不需要像
object para = myObj; 这样的代码出现,
在需要 object 类型的参数时,直接使用 myObj 即可。因为派生类可以隐式转换为它的基类。
2、
object对象作为函数参数时,并不都是使用引用方式,那要看具体的object对象的原型是什么,也可以是值类型。比如当object为int, uint, byte, string, Guid 等类型时,是进行值拷贝的,并不只是传递一个引用。对于C#的对象变量,我更倾向于它是一个指针,虽然.net貌似在非安全代码时没有所谓的指针。但除了值类型之外,我想其它的类型实例,它们的特点更像指针。
3、
GC的问题。也就是所谓的对象释放问题。首先,GC不是实时回收的,也就是说,当一个对象应当被释放时,GC很有可能不是在第一时间释放它,出于工作效率等各方面考虑,GC一般是定期回收内存的,或者也可以手用调用GC的相关函数才显示回收。同时,GC在回收内存是,有一定的标准,在这个标准里面,作用域就显得不是那么重要了,就算一个对象超出了定义它的代码所在的使用域,但同时如果还有其它变量引用它的话,GC就会认为该对象还在使用,并不会释放和回收它的。GC内部应该使用了一种类似引用计数器的设计,如果对象引用计数器不为零,那就不会释放该对象,这点有点像COM。你看过COM的机制的话,应该就会明白了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询