【转】【C#】C# 不常用关键字
1、__arglist
让我们先从__arglist开始。 __arglist是用来给方法传送参数。通常我们是通过函数头部指定的参数列表给方法传递参数的。如果我们想要给方法传递一组新的参数,我们需要重载方法。如果我们想要传递的参数数量不确定,我们需要使用param数组。我们为什么要使用__arglist,因为上面两种方法,存在的下面问题:
a、如果我们使用方法重载,一旦要传递一组新的参数,我们都要增加一个新的函数重载。
b、如果我们用param数组,参数类型必须相同或者使用param对象数组。
__arglist能解决上面的问题。你可以传递任何参数给函数,可以是任何类型,我们可以使用简单的步骤分析每个参数。
让我们先看下下面代码:
public int paramLength(__arglist)
{
ArgIterator iterator = new ArgIterator(__arglist);
return iterator.GetRemainingCount();
}
如果我使用下面代码调用该函数
int x = this.paramLength(__arglist(,,,,"Manimoy")); // returns 5
将被返回5给变量x。这是因为我们给这个方法传递了5个参数。我们可以访问每个参数,如:
TypedReference tf = iterator.GetNextArg();
TypedReference.ToObject(tf)
每次调用GetNextArg,GetRemainingCount将减1,直到遍历完迭代器的每个对象。
2、__refvalue
另一个有趣的关键字是__refvalue。它是用来获取一个引用对象的的值。你可以用来从TypedReference对象中获得实际对象。这需要两个参数,第一个就是TypedReference对象和另一个是转换的类型。看看下面代码:
int tfValue = __refvalue(tf, int);
3、__makeref
__makeref将使从对象中找出TypedReference对象。这跟_refvalue刚刚相反。请看下面的代码:
string name = "Ayan";
TypedReference tf = __makeref(name);
4、 __reftype
__reftype是用来从TypedReference类型的对象获得类型。看下面代码所示:
Type t = __reftype(tf);
if(t.ToString().equals("System.String"))
string str = __refvalue(t,string);
注:虽然我在所有的C#版本中发现上面这些关键字,但我没在工作中使用它。在未来版本的C#可能不存在这些关键字,所以是否使用看你自己的风险。
5、Yield
Yield出现在.NET 2.0中,使用Yield将以枚举数对象值的形式返回,yield 语句只能出现在iterator 块中,该块可用作方法、运算符或访问器的体。在以下代码中,我构建了一个名字列表,将返回长度小于5的名字列表,遇到yield break语句返回。
List<string> lst = new List<string>();
lst.Add("Abhishek");
lst.Add("Abhijit");
lst.Add("Manimoy");
lst.Add("Raj");
lst.Add("Ayan");
lst.Add("MacMillanRojer");
lst.Add("Rizzuto");
foreach (string x in lst)
{
if (x.Length > ) // Breaks on MacMillanRojer
yield break;
else if (x.Length > ) // Only returns those which are having length >5
yield return x;
else continue;
}
其实,yield return x 将判断每个元素,并创建了满足条件所有的元素的enumerable(length> 5)。 break语句将终止循环,并返回现有创建好的枚举。
6、 Fixed
另一种不常见的关键字是Fixed,它只能在不安全的C#代码块中使用。Fixed语句在个固定的内存地址设置一个指针,它不会被移动到任何地方,即使执行了垃圾收集线程。让我们来看看下面的代码:
int[] a = new int[] { , ,  };
fixed (int* pt = a)
{
   int* c = pt;
   MessageBox.Show("Value : " + *c);
   // This will fix the variable totally so that it will
   // not be moved when Garbage collector is invoked.
}
在这里,指针c和pt被分配相同的位置。Fixed通常会花销一些资源。实际上它妨碍垃圾收集的正常进程。因此,实际中应该避免使用 fixed语句。
7、Checked / Unchecked
另一个名为checked的关键字是用来控制算术溢出的情况。当算术运算溢出时,Checked关键字抛出OverflowException异常。
看下这段代码:
int x = int.MaxValue; int y = int.MaxValue; int z = checked(x + y);
上述声明中,当执行到x + y时,将抛出OverflowException异常。 checked用来检查运算溢出并引发相应的异常。 当发生OverflowException异常时,z被赋值为0。
当我们不需要抛出异常时,我们可以使用关键字unchecked。
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->int x = int.MaxValue; int y = int.MaxValue; int z = unchecked(x + y);
通过执行上面的代码,z的值将被赋值为-2。
8、Volatile
volatile关键字用于定义一个变量,这个变量跨多个线程修改而不被lock(虽然我们大部分的时间锁定它们)。 volatile变量不受编译器优化,因此我们将获得该变量的所有的时间最新的值。见下面的例子:
public volatile int i;
Thread th = new Thread(new ThreadStart(VolatileInvoke));
th.Start();
Thread.Sleep(); //Holds current Thread for 5 seconds.
MessageBox.Show("Value of i : " + i);
th.Abort(); private void VolatileInvoke()
{
while (true)
{
i++;
}
}
线程启动,volatile整数的值增加1,直到它被主线程中止。
注意:Volatile类型没有线程优化。
9、StackAlloc
在unsafe的C#代码中使用,动态从堆栈分配内存。stackalloc用于快速获取内存。当我们使用堆栈,我们可以利用内存快速存取的优势。我们可以这样声明一个数组:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> int* array = stackalloc new int[]
注意:您应该始终牢记,stackalloc内存是非常有限的。它是由每个线程默认为1MB。因此,如果我们需要大量的内存(超过1MB),我们必须回到原来堆内存结构。
10、 Global ::
当想要用本地的命名空间隐藏的全局的命名空间,这个关键字是非常方便的。假设我们有我们的项目中创建了一个名为System的类,C#中是允许这样做的。当我想使用全局的System空间时,我们必须使用global::.。让我们来看看下面的例子:
internal class System
{
internal class Array :IEnumerable
{
public int Length
{
get{return }
}
#region IEnumerable Members
public IEnumerator GetEnumerator()
{
Debug.Write("This is Dummy Array");
return base.GetEnumerator();
} #endregion
}
}
现在,如果你要调用System.Array它会调用一个本地定义。要调用全局的System,我们需要使用global::System。当你确定调用全局命名空间时,最好它始终使用global:: 。
11、Namespace/Class别名
我们使用using 来定义别名。有2种形式的别名:
a、Namespace别名:
当你想缩短比较长的命名空间时,可以使用命名空间的别名。
using Abhishek = System.Drawing;
public class X
{
public X()
{
Abhishek.Graphics g = this.CreateGraphics();
}
}
在这里,我们为System.Drawing的定义了一个别名Abhishek 。因此,我们在代码中引用Abhishek,与引用System.Drawing是相同的。
b、Class别名: 您也可以使用using语句来定义一个类引用。例如我写:using Abhishek=System.Drawing.Bitmap;
Abhisek等同于Bitmap类。我们可以创建Abhishe的对象,直接访问静态函数。
using Abhishek=System.Drawing.Graphics;
public class X
{
public X()
{
Abhishek g = this.CreateGraphics();
}
}
因此,Abhishek将对应本机的Graphics对象而不是整个命名空间的。
12、extern别名
我们使用C#工作,大多数时候需要引用外部控件集。
我们会遇到这样的情况,在相同的应用程序中相同命名空间中添加两个版本的dll时。在这种情况下,我们需要外部别名功能,来指定两个不同的程序集。
例如:
假设我们添加一个程序集x10.dll(V1),其中有一Y类
我们添加x20.dll(V2),我们可能要使用Y类
首先,要参考完全合格的程序集,我们需要在命令行中声明一个别名。
/r:XV1=X10.dll
/r:XV2=X20.dll
现在参考我们的使用
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> extern alias XV1; extern alias XV2;
13、??
??与null值一起使用。在2.0中引入。看以下内容:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> MyClass x = null; x = x ?? new MyClass();
??的意思是说,如果X是null 值,将new MyClass() ,否则将赋值现有的X值
14、@variables
通常是C#不允许使用关键字做变量的。但是有一种方式例外。我们可以通过使用@创建与关键字具有相同的名称的变量。
假设我们定义:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> int @int = ;
这意味着声明了一个名字为int的变量和并分配10给它。
15、Readonly
目前,readonly是C#关键字,用来创建不能被程序修改的变量。该声明为readonly的变量,变量的值将被分配一次,它将在整个对象执行过程中保持相同的值。
声明一个只读变量:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> public readonly int readonlyvariable = ;
声明了一个值为20 的变量。再对这个变量赋值是不允许的。
16 、Const & readonly 的区别?
readonly类似关键字const。唯一不同的是, const 变量在编译时定义的,readonly变量在运行时定义。您可以从内部构造函数中分配readonly变量的值,因此根据你的构造函数分配,readonly值可能不同。
public readonly int readsecond;
public Documented()
{
readsecond = DateTime.Now.Second;
}
在这里,readsecond将根据对象的初始化指派不同的值,对于const这是不可能的。
17 、Default
对于一般对象,关键字default非常方便。当对象未初始化,它返回的默认值。例如,如果没有赋予任何值,我们都知道整数被初始化为0。当没有赋任何值,字符串为空字符。当不指定任何值,对象为null。
这些值是根据default关键字分配。 因此,如果我们写:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> int x = default(int);//will be assigned to 0
类似于: int x; 一般情况下,当类型不确定时,我们可以使用default来分配特定的值给对象。让我们看看该示例:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> public T GetDefault<T>() { return default(T); }
该函数返回每个类型的默认值。从而
因此,我们可以使用关键字default非常容易获取对象默认的分配的值。
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> int defx = this.GetDefault<int>(); //will assign 0 char defy = this.GetDefault<char>(); // will assign null('\0') object defz = this.GetDefault<object>(); // will assign null
18、Nullable Types
C#的Nullable类型可以处理空值甚至是基本数据类型。每个nullable类型是来自System.Nullable。我们可以这样定义nullables:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> int? nullableint = null;
这里nullableint将被赋值null。
如果您访问nullable变量,您将获得2个属性。
HasValue属性将返回false,如果null被分配给变量;
Value属性返回变量的实际值。
您还可以使用每种nullable类型的对象的GetValueOrDefault函数来得到变量的默认值。
结论:
我的目的是给你一个简短方式介绍一下这些关键字的知识,以及如何去使用它们。请随意发表您的评论。
原文地址:http://www.cnblogs.com/zhuqil/archive/2010/04/09/UnCommon-Csharp-keywords-A-Look.html
【转】【C#】C# 不常用关键字的更多相关文章
- Java SE 基础:常用关键字
		Java SE 基础:常用关键字 常用关键字表 
- JAVA常用关键字
		Java 中常用关键字: 一一解释(先以印象注明含义,若有错误或未填写的待用到后补充.更新):(蓝色为不确定部分) abstract : 虚类 boolean : 类型定义——布尔型 break : ... 
- Oracle数据库常用关键字以及函数
		常用关键字 insert into---插入数据 delete---删除数据 update---更新一条数据 select---实际工作中尽量不要写* set---设置某些属性 where---给执行 ... 
- Selenium2Lib库之鼠标事件常用关键字实战
		1.2 鼠标事件常用关键字 1.2.1 Click Button关键字按F5 查看Click Button关键字的说明,如下图: Click Button关键字 是用于点击页面上的按钮.参数locat ... 
- Cucumber常用关键字
		常用关键字(中英文对应) 对应的测试用例 Feature(功能) test suite (测试用例集) background(背景) Scenario(场景) test case(测试用例) Sc ... 
- AppiumLibrary常用关键字
		通过上一章节,open application关键字的使用,相信大家对手机自动化充满了兴趣,那么今天这一章节,主要介绍AppiumLibrary中常用关键字的使用. 一.实用函数 关键字 含义 实例 ... 
- JAVA基础部分复习(六、常用关键字说明)
		/** * JAVA中常用关键字复习 * final * finalize * finally * * @author dyq * */ public class KeyWordReview exte ... 
- Robot Framework常用关键字介绍
		常用关键字介绍 在学习一门编程语言的时候,大多教材都是从打印“hello world”开始.我们可以像编程语言一样来学习 Robot Framework.虽然通过 RIDE 提供“填表”一样的写测试用 ... 
- python保留关键字和常用关键字
		python保留关键字和常用关键字如下: 上图是python3中的关键字,python2.7中的关键字部分会有区别,具体在自己打印输出查看: import keyword print ' '.join ... 
- oracle常用关键字和函数
		数据库的增删改查: 增:insert into ... values(); 例:insert into p_emp values(sq_emp.nextval,,sysdate,,null,,); c ... 
随机推荐
- SharePoint 页面中添加.Net代码
			今天整理资料,看到一个非常有意思的截图,可以在SharePoint页面库里的页面中,添加.Net代码,只需修改一下相应应用程序的web.config文件,即可: 在web.config里面的<P ... 
- 弃用的同步get和post请求
			#import "ViewController.h" #import "Header.h" @interface ViewController () <N ... 
- 【原】xcode5.0升级5.1遇到的clang: error: unknown argument: '-fobj-arc'错误
			XCODE5.0升到XCODE5.1后LLVM也从5.0升到5.1,工程报下面的错误了: clang: error: unknown argument: '-fobj-arc' [-Wunused-c ... 
- iOS 界面调试利器Reveal
			Reveal下载地址:http://revealapp.com/ ,目前要收费了,而且还不便宜,好东西都这样嘛~ 针对越狱设备和非越狱设备可以采取不同的方法,一种是在工程项目中加入Reveal.fra ... 
- UIWebView的基本用法
			一.UIWebView的基础使用 1.创建UIWebView: CGRect bouds = [[UIScreen manScreen]applicationFrame]; UIWebView* we ... 
- Handler、Looper、MessageQueue、Thread源码分析
			关于这几个之间的关系以及源码分析的文章应该挺多的了,不过既然学习了,还是觉得整理下,印象更深刻点,嗯,如果有错误的地方欢迎反馈. 转载请注明出处:http://www.cnblogs.com/John ... 
- Visual Studio发布Web项目报错:Unable to add 'xxx' to the Web site.  Unable to add file 'xxx'. The specified file could not be encrypted.
			背景 Visual Studio下的Web项目 现象 发布时遇到Unable to add 'xxx' to the Web site. Unable to add file 'xxx'. The ... 
- 关于String StringBuffer StringBuilder
			0. String对象的创建 1.关于类对象的创建,很普通的一种方式就是利用构造器,String类也不例外:String s=new String("Hello world&qu ... 
- Effective Java 70 Document thread safety
			Principle The presence of the synchronized modifier in a method declaration is an implementation det ... 
- Linux ethtool命令
			一.简介 ethtool 是用于查询及设置网卡参数的命令. 二.常用选项 ethtool ethx //查询ethx网口基本设置,其中 x 是对应网卡的编号,如eth0.eth1等等 ethtool ... 
