调用函数的时候,常常使用out关键字修饰传入的参数,这样可以将输出值放到参数中输出。某种意义上,这很有点像C++语言中用&实现的“引用”或者用指针实现的数据传递。不过当参数是类的对象的时候,C#和C++相比就有了很大的不同。

C++中,如果传入的参数是对象的指针,那么该指针在实例化之前传入,或者在被调用函数内部通过new语句被重新赋值,那么往往会造成出错,因为离开函数作用域以后(也就是被调用函数返回以后),你在被调用函数中定义的所有数据和对象原则上都会被回收,而返回的指针如果还是指向“不存在的对象”,则会造成种种不可预知的错误!所以,在C++使用引用或者“引用”传递对象的时候一定要考虑清楚。

C#中,如果参数凑巧是对象,那么该对象在实例化之间就可以被调用;在调用的函数内部,C#要求一定要先将out修饰的参数实例化之后才能使用;从这个意义上说,最好在传入的时候就不要实例化,因为这样可以提高效率。

为什么C++和C#差别这么大?因为C#有“垃圾自动回收机制”,而C++就必须靠程序员自己管理内存了,如果水平不够或者比较粗心或者不知道什么理由忘记了一个小小的delete,“内存泄漏”就会像定时炸弹一样不知什么时候会把你炸得外焦里嫩。因此C#程序员可以肆无忌惮地创建和使用对象,从不担心内存碎片问题;而C++程序员则遇到指针和new就如临大敌战战兢兢,因为很可能开发时一分的不小心会导致后期十二分的辛苦修改。

代码如下:

    class Program
{
static void Main(string[] args)
{
outTestClass otc;
useClass uc = new useClass();
//使用out关键字,输入参数如果是对象,可以不new,也可以new
uc.GetOutObjInfo(out otc);
Console.WriteLine(otc.GetStr());
}
}

class outTestClass
{
private string _strName;
public outTestClass()
{
_strName = "outTestClass";
}

public void SetStr(string str)
{
_strName = str;
}

public string GetStr()
{
return _strName;
}
}

class useClass
{
public void GetOutObjInfo(out outTestClass tc)
{
tc = new outTestClass();
tc.SetStr("User");
}
}

 

 

posted on 2011-11-03 10:28  夜观电脑  阅读(292)  评论(0编辑  收藏  举报