【51CTO独家特稿】本文的第一部分介绍没有文档记载的关键字,笔者保证这些C#关键字你肯定没有见到过,即使你去MSDN文档中找也没有,这些C#关键字也没有出现在Visual Studio的intellesence菜单中。
第二部分介绍有文档记载但不常用的C#关键字,或只不过是引入C#中的关键字,这些C#关键字在MSDN文档中是可以找到的。
我也为本文所涉及到的一些C#关键字制作了一些简单的例子,如果你有兴趣去测试,可以从http://www.codeproject.com/KB/Blogs/38695/UncommonTestSample.zip下载源代码。
无文档记载的C#关键字
1、__arglist
__arglist用于向一个函数发送一个参数,我们向函数发送参数的常规做法是在函数头指定一个参数列表,如果要向函数追加一个新参数,需要函数重载才行,如果要发送多个参数,可以使用参数数组。
那么我们为什么要使用__arglist呢?上面任何一种传递参数的方法都存在如下问题:
A) 如果我们使用函数重载,我们不得不为新增加的参数设计新的函数。
B) 如果我们使用参数数组,那参数类型必须相同,或者需要参数数组对象。
但__arglist不需要这么复杂,可以传递任何数量的参数给函数,可以是任何的类型,让我们看一段代码:
1. public int paramLength(__arglist)
2. {
3. ArgIterator iterator = new ArgIterator(__arglist);
4. return iterator.GetRemainingCount();
5. }
下面我调用这个函数:
1. int x = this.paramLength(__arglist(49,34,54,6,"Manimoy")); // returns 5
变量x将返回5,因为我们发送了5个参数给函数,我们可以使用下面的方法访问每一个函数:
1. TypedReference tf = iterator.GetNextArg();
2. TypedReference.ToObject(tf)
每调用一次GetNextArg,GetRemainingCount就会减少1,直到每个对象设置的迭代次数用完。
2、__refvalue
__refvalue从一个引用对象匹配值,可以使用它从TypedReference对象中获得真实的对象,它需要两个参数,一个是TypedReference对象,一个是要转换的类型,看下面的代码:
1. int tfValue = __refvalue(tf, int);
执行后tfValue将被分配tf指向的整数值。
3、__makeref
__makeref可以从对象自身中提取出TypedReference对象,它和__refvalue刚刚相反,来看下面的代码:
1. string name = "Ayan";
2. TypedReference tf = __makeref(name);
4、__reftype
__reftype用于从TypedReference获取Type对象,看下面的代码你就知道怎么回事了:
1. Type t = __reftype(tf);
2. if(t.ToString().equals("System.String"))
3. string str = __refvalue(t,string);
注意:虽然我在所有C#版本中都发现了这些关键字,但我并没有将它们用于生产环境,我不能保证这些关键字在今后的版本是否会仍然存在,使用风险一切由你自行承担。