请高手回答一个用object作为函数参数的问题??

来源:百度知道 编辑:UC知道 时间:2024/05/27 20:55:24
有一个主函数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对象,是吗??

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的机制的话,应该就会明白了。

是同一个内存单元,但是不会在主先程执行完毕后消失。
因为C#不是c++.
c#中的任何变量(包含函数范围的局部变量)的生命期
都由运行时控制,而不是在函数,线程等等结束时被消灭
掉。运行时跟踪任何一个变量,发现子线程中的方法仍然
引用着该变量时,是不会消灭这个变量的。
楼主需要理解C#和c++在内存控制方面的巨大差别,一言
概之,C#中的变量属于应用程序域,而不属于进程,线程,方法,对象等等。