18个不常见的C#关键字,您使用过几个?

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)

复制代码

每次调用GetNextArg,GetRemainingCount将减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 List<string> lst = new List<string>();
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 MacMillanRojer
12 yield break;
13 else if (x.Length > 5) // Only returns those which are having length >5
14 yield return x;
15 else continue;
16 }
17

复制代码

其实,yield return x 将判断每个元素,并创建了满足条件所有的元素的enumerable(length> 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 will
7 // 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 System
2 {
3 internal class Array :IEnumerable
4 {
5 public int Length
6 {
7 get{return 1000}
8 }
9 #region IEnumerable Members
10 public IEnumerator GetEnumerator()
11 {
12 Debug.Write("This is Dummy Array");
13 return base.GetEnumerator();
14 }
15
16 #endregion
17 }
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 Abhishek=System.Drawing.Bitmap;

Abhisek等同于Bitmap类。我们可以创建Abhishe的对象,直接访问静态函数。


1 using Abhishek=System.Drawing.Graphics;
2 public class X
3 {
4 public X()
5 {
6 Abhishek g = this.CreateGraphics();
7 }
8 }

复制代码

因此,Abhishek将对应本机的Graphics对象而不是整个命名空间的。

12、extern别名

我们使用C#工作,大多数时候需要引用外部控件集。

我们会遇到这样的情况,在相同的应用程序中相同命名空间中添加两个版本的dll时。在这种情况下,我们需要外部别名功能,来指定两个不同的程序集。

例如:

假设我们添加一个程序集x10.dll(V1),其中有一Y类

我们添加x20.dll(V2),我们可能要使用Y类

首先,要参考完全合格的程序集,我们需要在命令行中声明一个别名。

/r:XV1=X10.dll

/r:XV2=X20.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 GetDefault<T>()
2 {
3 return default(T);
4 }

复制代码

该函数返回每个类型的默认值。从而

因此,我们可以使用关键字default非常容易获取对象默认的分配的值。


1 int defx = this.GetDefault<int>(); //will assign 0
2 char defy = this.GetDefault<char>(); // will assign null('\0')
3 object defz = this.GetDefault<object>(); // will assign null

复制代码

18、Nullable Types

C#的Nullable类型可以处理空值甚至是基本数据类型。每个nullable类型是来自System.Nullable。我们可以这样定义nullables:


1 int? nullableint = null;

这里nullableint将被赋值null。

如果您访问nullable变量,您将获得2个属性。

HasValue属性将返回false,如果null被分配给变量;

Value属性返回变量的实际值。

您还可以使用每种nullable类型的对象的GetValueOrDefault函数来得到变量的默认值。

结论:

我的目的是给你一个简短方式介绍一下这些关键字的知识,以及如何去使用它们。请随意发表您的评论。

代码点击下载

PS:

1到4是Undocumented关键字,5到18是documented关键字。

如果觉得对你有点帮助,或者有点意思。请推荐一下,谢谢。




原文参考:UnCommon C# keywords - A Look



作者:朱祁林
出处:http://zhuqil.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C指针详解

前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则:从变量名处起,根据运…

java collection api_Java Stream和Collection比较:何时以及如何从Java API返回?

向您展示一些可以非常方便地使用Java Stream流的场景以及如何使用它们的示例。本文基于标准Java库java.util.stream。它既与反应流无关&#xff0c;也与诸如Vavr之类的其他流实现无关。另外&#xff0c;我将不介绍诸如并行执行之类的流的高级细节。首先&#xff0c;让我们简要讨…

依赖属性

项目的WF中用到了依赖属性, 有点晕, 不明白, 先来段代码: public static DependencyProperty IsSignInProperty DependencyProperty.Register("IsSignIn", typeof(System.String), typeof(StateMachineWF.WF1)); [DesignerSerializationVisibilityAttribute(Designe…

[UE4]集合:TSet容器

一、TSet<T>是什么 UE4中&#xff0c;除了TArray动态数组外&#xff0c;还提供了各种各样的模板容器。这一节&#xff0c;我们就介绍集合容器——TSet<T>。类似于TArray<T>&#xff0c;尖括号里面的T是模板类型&#xff0c;可以是任何C类型。一个集合表示了一…

【汇总】flash单个文件上传

之前有朋友给我发送email&#xff0c;询问我是否有单个文件上传的源代码&#xff0c;因为当时写这个好像是在09年&#xff0c;所以放哪了一时也没找着。后来整理硬盘的时候&#xff0c;找到了源码&#xff0c;所以决定来个汇总&#xff08;之前写过的关于flashjs上传文件的例子…

2018.3.24 struct

好了今天听完了struct&#xff0c;感觉也差不多了&#xff0c;后面的视频不想听了&#xff0c;io啊预处理啊什么的用时候现学就好了。主要是就这么光听却没有作业可做真的有点不爽。 明天开始15-213&#xff0c;反正手头也有c primer plus了&#xff0c;后面遇到什么问题看书就…

一直苦于没有好的资产管理软件,GLPI能解决吗?

一直苦于没有好的资产管理软件&#xff0c;正好看到网上文章有介绍glpi资产管理开源软件 在此做个记录&#xff0c;有时间一定要测试一下 &#xff08;1&#xff09;资产管理工具GLPI 官网 http://www.glpi-project.org/ GLPI是法语Gestionnaire libre de parc informatique的…

weka的java环境配置_windows下安装和配置Weka

Weka是一款免费的&#xff0c;非商业化的&#xff0c;基于java环境下的开源的机器学习以及数据挖掘软件。Weka里含有各种数据挖掘工具&#xff1a;数据预处理&#xff0c;分类与回归&#xff0c;聚类&#xff0c;关联规则和可视化工具。一、安装weka我们首先需要到weka官网上下…

Windows部署服务WDS实例

一&#xff1a;概述<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />Windows&#xff08;Windows Deployment Services&#xff09; 部署服务适用与大中型网络中的计算机操作系统部署。可以使用 Windows 部署服务来管理映像以及无…

JAVA----爬虫(一)JSoup

jsoup 是一款Java 的HTML解析器&#xff0c;可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API&#xff0c;可通过DOM&#xff0c;CSS以及类似于jQuery的操作方法来取出和操作数据。 官方api:https://jsoup.org/ 一、jsoup功能 简单的例子&#xff1a;抓取wiki的…

java语言模拟_Java语言模拟操作系统.doc

河北大学2010级操作系统课程设计论文PAGEPAGE 27装订线装订线(指导教师用表)学 生 姓 名指 导 教 师论文(设计)题目Java语言模拟操作系统主要研究(设计)内容使用java语言&#xff0c;采用多到程序设计方法基本上实现并模拟了单用户操作系统。该操作系统包括四部分内容&#xff…

极速理解设计模式系列:22.状态模式(State Pattern)

四个角色&#xff1a;抽象状态类(State)、具体状态类(ConcreateState)、情景类(Context)、客户端(Client) 抽象状态类(State):提供一个与情景类有关的State行为。 具体状态类(ConcreateState):实现这个行为&#xff0c;实现一个状态。 情景类(Context):维护一个State的实例对象…

485. Max Consecutive Ones

原题链接&#xff1a;https://leetcode.com/problems/max-consecutive-ones/description/ 这道题目级别为easy&#xff0c;实际做起来也是so easy&#xff1a; /*** Created by clearbug on 2018/2/26.*/ public class Solution {public static void main(String[] args) {Solu…

[转]extern使用方法总结

Extern的问题在于不知道这个关键词出现的时候到底是声明还是定义。谨记&#xff1a;声明可以多次&#xff0c;定义只能一次。在使用中&#xff0c;要形成一种风格。 函数的声明extern关键词是可有可无的&#xff0c;因为函数本身不加修饰的话就是extern的。但是引用的时候一样是…

java 设置pdf 编码格式_Java如何设置PDF文档背景色详解

前言一般生成的PDF文档默认的文档底色为白色&#xff0c;我们可以通过一定方法来更改文档的背景色&#xff0c;以达到文档美化以及保护双眼的作用。 以下内容提供了Java编程来设置PDF背景色的方法。包括&#xff1a;设置纯色背景设置图片背景使用工具Spire.PDF for Java 2.0.3J…

关于strassen矩阵乘法的矩阵大小不是2^k的形式时,时间复杂度是否还是比朴素算法好的看法...

原来是n&#xff0c;找到大于等于n且是2^k形式的数m。n*n的矩阵补全为m*m的矩阵&#xff0c;原来的矩阵放在最左上方&#xff0c;其它位置的值为0.朴素方法&#xff1a;n^3现在&#xff1a;m^2.8即m/n需小于e^(3/2.8)2.919才能好&#xff0c;而n<m<2*n&#xff0c;即使用…

UtilSession failed: Prerequisite check CheckSystemSpace space(22288172004) is not availa

如果你在使用OPatch打11.2 GI/CRS上的PSU时遇到了如上错误信息"UtilSession failed: Prerequisite check "CheckSystemSpace" space"则说明你的CRS_HOME所在文件系统的空闲空间不足22g&#xff0c;这会导致OPatch预检测无法通过。 UTIL session.Oracle…

数据库 oracle 设计三范式

一&#xff1a;表中的数据不能重复&#xff0c;每个字段不可再分。2&#xff1a; 建立在第一范式上&#xff0c;表中的非主键字段必须全部依赖主键&#xff0c;不能部分依赖主键3 建立在第二范式基础上的&#xff0c;非主键字段不能传递依赖于主键字段。转载于:https://www.cnb…

java websocket高并发测试_Websocket全讲解。跨平台的通讯协议 !!基于websocket的高并发即时通讯服务器开发。...

本博文&#xff0c;保证不用装B的话语和太多专业的语言&#xff0c;保证简单易懂&#xff0c;只要懂JAVAEE开发的人都可以看懂。 本博文发表目的是&#xff0c;目前网上针对Websocket的资料太散乱&#xff0c;导致初学者的知识体系零零散散&#xff0c;学习困难加大。本博加以整…

C#实现文件下载代码

提供个C#实现文件下载代码  一&#xff0e;概述&#xff1a; 本文通过一个实例向大家介绍用Visual C#进行Internet通讯编程的一些基本知识。我们知道.Net类包含了请求/响应层、应用协议层、传输层等层次。在本程序中&#xff0c;我们运用了位于请求/响应层的WebRequest类以及W…