【转】【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 ...
随机推荐
- Installation failed with message INSTALL_FAILED_UID_CHANGED.--APK安装失败解决方法
出现此错误原因大都为:手机上原来APK存在残留,即没有卸载干净,导致不能安装新的APK 解决办法: 1.手机上手动卸载出现问题的APP,再重新安装 2.如果apk无法卸载,则将apk相关文件和相关内容 ...
- 消除 activity 启动时白屏、黑屏问题
默认情况下 activity 启动的时候先把屏幕刷成白色,再绘制界面,绘制界面或多或少有点延迟,这段时间中你看到的就是白屏,显然影响用户体验,怎么消除呢? 在 Activity theme 设置sty ...
- 汇编语言--寄存器(cpu工作原理)
本文地址:http://www.cnblogs.com/archimedes/p/assembly-register.html,转载请注明源地址. 本文主要将介绍的是8086 CPU中的寄存器, 寄存 ...
- iOS面试中常见的算法题目
一.前言 这里是在iOS求职中自己遇到的算法题,希望对大家有所帮助.不定期更新.如果大家想在线运行代码调试,可以将代码拷贝到这里.然后进行调试.下面就是常见的算法题目. 二.正文 1.就n的阶乘.(这 ...
- 设计模式:模版模式(Template Pattern)-转
模版模式 又叫模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤. 我们使用冲泡咖啡和冲泡茶的例子 加工流程 ...
- 【原】就IOS发布app时如何保护文本资源的一个方法
近期的一个app是本地的,数据源来自于本地的一个.json文件,里面的数据是这个app的灵魂.近期快发布该app了,很担心发布后的.ipa包被竞争者解开然后信息发生泄漏.我的处理策略是:打包的时候放的 ...
- 【转】C++的拷贝构造函数深度解读,值得一看
建议看原帖 地址:http://blog.csdn.net/lwbeyond/article/details/6202256 一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很 ...
- 通过注册的URL Scheme向目标APP传递参数
通过注册的URL Scheme向目标APP传递参数 通过URL Scheme启动APP很简单就可以做到,但有时候我们想在启动APP的时候传递一些参数,这个时候我们就可以通过URL Scheme自定义U ...
- H5文件操作API
引言 在之前我们操作本地文件都是使用flash.silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很难进行跨平台.或者跨浏览器.跨设备等情况下实现统一的表现,从另外一个 ...
- ajaxFileUpload文件上传
一.简介 ajaxFileUpload是一种异步的文件上传控件,通过ajax进行文件上传,并获取上传处理结果.在很多时候我们需要使用到文件上传的功能,但是不需要使用那些强大的上传插件.此时就可以使用a ...