asp.net 网站 结构,门户网站营销策略,网站开发商城1688,温州 公司 网站18个不常见的C#关键字#xff0c;您使用过几个#xff1f;1、__arglist 让我们先从__arglist开始。 __arglist是用来给方法传送参数。通常我们是通过函数头部指定的参数列表给方法传递参数的。如果我们想要给方法传递一组新的参数#xff0c;我们需要重载方法。如果我们想… 18个不常见的C#关键字您使用过几个1、__arglist 让我们先从__arglist开始。 __arglist是用来给方法传送参数。通常我们是通过函数头部指定的参数列表给方法传递参数的。如果我们想要给方法传递一组新的参数我们需要重载方法。如果我们想要传递的参数数量不确定我们需要使用param数组。我们为什么要使用__arglist因为上面两种方法存在的下面问题a、如果我们使用方法重载一旦要传递一组新的参数我们都要增加一个新的函数重载。b、如果我们用param数组参数类型必须相同或者使用param对象数组。__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 将被返回5给变量x。这是因为我们给这个方法传递了5个参数。我们可以访问每个参数如 1 TypedReference tf iterator.GetNextArg();2 TypedReference.ToObject(tf)复制代码每次调用GetNextArgGetRemainingCount将减1直到遍历完迭代器的每个对象。2、__refvalue 另一个有趣的关键字是__refvalue。它是用来获取一个引用对象的的值。你可以用来从TypedReference对象中获得实际对象。这需要两个参数第一个就是TypedReference对象和另一个是转换的类型。看看下面代码1 int tfValue __refvalue(tf, int); 3、__makeref __makeref将使从对象中找出TypedReference对象。这跟_refvalue刚刚相反。请看下面的代码1 string name Ayan;2 TypedReference tf __makeref(name);复制代码4、 __reftype__reftype是用来从TypedReference类型的对象获得类型。看下面代码所示1 Type t __reftype(tf);2 if(t.ToString().equals(System.String))3 string str __refvalue(t,string); 复制代码注虽然我在所有的C版本中发现上面这些关键字但我没在工作中使用它。在未来版本的C可能不存在这些关键字所以是否使用看你自己的风险。5、Yield Yield出现在.NET 2.0中使用Yield将以枚举数对象值的形式返回yield 语句只能出现在iterator 块中该块可用作方法、运算符或访问器的体。在以下代码中我构建了一个名字列表将返回长度小于5的名字列表遇到yield break语句返回。1 Liststring lst new Liststring();2 lst.Add(Abhishek);3 lst.Add(Abhijit);4 lst.Add(Manimoy);5 lst.Add(Raj);6 lst.Add(Ayan);7 lst.Add(MacMillanRojer);8 lst.Add(Rizzuto);9 foreach (string x in lst)10 {11 if (x.Length 12) // Breaks on MacMillanRojer12 yield break;13 else if (x.Length 5) // Only returns those which are having length 514 yield return x;15 else continue;16 }17 复制代码其实yield return x 将判断每个元素并创建了满足条件所有的元素的enumerablelength 5。break语句将终止循环并返回现有创建好的枚举。6、 Fixed 另一种不常见的关键字是Fixed它只能在不安全的C代码块中使用。Fixed语句在个固定的内存地址设置一个指针它不会被移动到任何地方即使执行了垃圾收集线程。让我们来看看下面的代码1 int[] a new int[] { 1, 2, 3 };2 fixed (int* pt a)3 {4 int* c pt;5 MessageBox.Show(Value : *c);6 // This will fix the variable totally so that it will7 // not be moved when Garbage collector is invoked. 8 }复制代码在这里指针c和pt被分配相同的位置。Fixed通常会花销一些资源。实际上它妨碍垃圾收集的正常进程。因此实际中应该避免使用 fixed语句。7、Checked / Unchecked 另一个名为checked的关键字是用来控制算术溢出的情况。当算术运算溢出时Checked关键字抛出OverflowException异常。 看下这段代码1 int x int.MaxValue;2 int y int.MaxValue;3 int z checked(x y); 复制代码 上述声明中当执行到x y时将抛出OverflowException异常。 checked用来检查运算溢出并引发相应的异常。 当发生OverflowException异常时z被赋值为0。 当我们不需要抛出异常时我们可以使用关键字unchecked。1 int x int.MaxValue;2 int y int.MaxValue;3 int z unchecked(x y);复制代码 通过执行上面的代码z的值将被赋值为-2。8、Volatile volatile关键字用于定义一个变量这个变量跨多个线程修改而不被lock虽然我们大部分的时间锁定它们。 volatile变量不受编译器优化因此我们将获得该变量的所有的时间最新的值。见下面的例子1 public volatile int i;2 Thread th new Thread(new ThreadStart(VolatileInvoke));3 th.Start();4 Thread.Sleep(5000); //Holds current Thread for 5 seconds. 5 MessageBox.Show(Value of i : i);6 th.Abort();7 8 private void VolatileInvoke()9 {10 while (true)11 {12 i;13 }14 } 复制代码线程启动volatile整数的值增加1直到它被主线程中止。注意Volatile类型没有线程优化。9、StackAlloc 在unsafe的C代码中使用动态从堆栈分配内存。stackalloc用于快速获取内存。当我们使用堆栈我们可以利用内存快速存取的优势。我们可以这样声明一个数组1 int* array stackalloc new int[1000] 注意您应该始终牢记stackalloc内存是非常有限的。它是由每个线程默认为1MB。因此如果我们需要大量的内存超过1MB我们必须回到原来堆内存结构。10、 Global :: 当想要用本地的命名空间隐藏的全局的命名空间这个关键字是非常方便的。假设我们有我们的项目中创建了一个名为System的类C中是允许这样做的。当我想使用全局的System空间时我们必须使用global::.。让我们来看看下面的例子1 internal class System2 {3 internal class Array :IEnumerable 4 {5 public int Length6 {7 get{return 1000}8 }9 #region IEnumerable Members10 public IEnumerator GetEnumerator()11 {12 Debug.Write(This is Dummy Array);13 return base.GetEnumerator();14 }15 16 #endregion17 }18 }复制代码 现在如果你要调用System.Array它会调用一个本地定义。要调用全局的System我们需要使用global::System。当你确定调用全局命名空间时最好它始终使用global:: 。11、Namespace/Class别名我们使用using 来定义别名。有2种形式的别名a、Namespace别名: 当你想缩短比较长的命名空间时可以使用命名空间的别名。1 using Abhishek System.Drawing;2 public class X 3 {4 public X()5 {6 Abhishek.Graphics g this.CreateGraphics();7 }8 } 复制代码在这里我们为System.Drawing的定义了一个别名Abhishek 。因此我们在代码中引用Abhishek与引用System.Drawing是相同的。b、Class别名:您也可以使用using语句来定义一个类引用。例如我写using AbhishekSystem.Drawing.Bitmap; Abhisek等同于Bitmap类。我们可以创建Abhishe的对象直接访问静态函数。1 using AbhishekSystem.Drawing.Graphics;2 public class X3 {4 public X()5 {6 Abhishek g this.CreateGraphics();7 }8 }复制代码因此Abhishek将对应本机的Graphics对象而不是整个命名空间的。12、extern别名 我们使用C工作大多数时候需要引用外部控件集。我们会遇到这样的情况在相同的应用程序中相同命名空间中添加两个版本的dll时。在这种情况下我们需要外部别名功能来指定两个不同的程序集。例如假设我们添加一个程序集x10.dllV1其中有一Y类我们添加x20.dllV2我们可能要使用Y类首先要参考完全合格的程序集我们需要在命令行中声明一个别名。/r:XV1X10.dll /r:XV2X20.dll 现在参考我们的使用1 extern alias XV1;2 extern alias XV2;复制代码13、?? ??与null值一起使用。在2.0中引入。看以下内容1 MyClass x null;2 x x ?? new MyClass();复制代码??的意思是说如果X是null 值将new MyClass() 否则将赋值现有的X值14、variables 通常是C不允许使用关键字做变量的。但是有一种方式例外。我们可以通过使用创建与关键字具有相同的名称的变量。假设我们定义1 int int 10;这意味着声明了一个名字为int的变量和并分配10给它。15、Readonly 目前readonly是C关键字用来创建不能被程序修改的变量。该声明为readonly的变量变量的值将被分配一次它将在整个对象执行过程中保持相同的值。声明一个只读变量1 public readonly int readonlyvariable 20; 声明了一个值为20 的变量。再对这个变量赋值是不允许的。16 、Const readonly 的区别 readonly类似关键字const。唯一不同的是 const 变量在编译时定义的readonly变量在运行时定义。您可以从内部构造函数中分配readonly变量的值因此根据你的构造函数分配readonly值可能不同。1 public readonly int readsecond;2 public Documented()3 {4 readsecond DateTime.Now.Second;5 } 复制代码在这里readsecond将根据对象的初始化指派不同的值对于const这是不可能的。17 、Default 对于一般对象关键字default非常方便。当对象未初始化它返回的默认值。例如如果没有赋予任何值我们都知道整数被初始化为0。当没有赋任何值字符串为空字符。当不指定任何值对象为null。这些值是根据default关键字分配。因此如果我们写1 int x default(int);//will be assigned to 0 类似于int x;一般情况下当类型不确定时我们可以使用default来分配特定的值给对象。让我们看看该示例1 public T GetDefaultT()2 {3 return default(T);4 } 复制代码该函数返回每个类型的默认值。从而因此我们可以使用关键字default非常容易获取对象默认的分配的值。1 int defx this.GetDefaultint(); //will assign 02 char defy this.GetDefaultchar(); // will assign null(\0)3 object defz this.GetDefaultobject(); // will assign null复制代码18、Nullable Types C的Nullable类型可以处理空值甚至是基本数据类型。每个nullable类型是来自System.Nullable。我们可以这样定义nullables1 int? nullableint null; 这里nullableint将被赋值null。如果您访问nullable变量您将获得2个属性。HasValue属性将返回false如果null被分配给变量Value属性返回变量的实际值。您还可以使用每种nullable类型的对象的GetValueOrDefault函数来得到变量的默认值。结论我的目的是给你一个简短方式介绍一下这些关键字的知识以及如何去使用它们。请随意发表您的评论。代码点击下载PS1到4是Undocumented关键字5到18是documented关键字。如果觉得对你有点帮助或者有点意思。请推荐一下谢谢。原文参考UnCommon C# keywords - A Look 作者朱祁林 出处http://zhuqil.cnblogs.com 本文版权归作者和博客园共有欢迎转载但未经作者同意必须保留此段声明且在文章页面明显位置给出原文连接否则保留追究法律责任的权利。