自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一些不常見的C#關(guān)鍵字介紹

原創(chuàng)
開發(fā) 后端
這是一篇比較偏門的文章,我想給你介紹的是你平時(shí)在編程中可能沒有注意到的一些不常見的東西,我將分兩部分介紹一些不常見的C#關(guān)鍵字。

【51CTO獨(dú)家特稿】本文的第一部分介紹沒有文檔記載的關(guān)鍵字,筆者保證這些C#關(guān)鍵字你肯定沒有見到過,即使你去MSDN文檔中找也沒有,這些C#關(guān)鍵字也沒有出現(xiàn)在Visual Studio的intellesence菜單中。

第二部分介紹有文檔記載但不常用的C#關(guān)鍵字,或只不過是引入C#中的關(guān)鍵字,這些C#關(guān)鍵字在MSDN文檔中是可以找到的。

我也為本文所涉及到的一些C#關(guān)鍵字制作了一些簡單的例子,如果你有興趣去測試,可以從http://www.codeproject.com/KB/Blogs/38695/UncommonTestSample.zip下載源代碼。

無文檔記載的C#關(guān)鍵字

1、__arglist

__arglist用于向一個(gè)函數(shù)發(fā)送一個(gè)參數(shù),我們向函數(shù)發(fā)送參數(shù)的常規(guī)做法是在函數(shù)頭指定一個(gè)參數(shù)列表,如果要向函數(shù)追加一個(gè)新參數(shù),需要函數(shù)重載才行,如果要發(fā)送多個(gè)參數(shù),可以使用參數(shù)數(shù)組。

那么我們?yōu)槭裁匆褂胈_arglist呢?上面任何一種傳遞參數(shù)的方法都存在如下問題:

A)  如果我們使用函數(shù)重載,我們不得不為新增加的參數(shù)設(shè)計(jì)新的函數(shù)。

B) 如果我們使用參數(shù)數(shù)組,那參數(shù)類型必須相同,或者需要參數(shù)數(shù)組對(duì)象。

但__arglist不需要這么復(fù)雜,可以傳遞任何數(shù)量的參數(shù)給函數(shù),可以是任何的類型,讓我們看一段代碼:

  1. public int paramLength(__arglist)  
  2. {  
  3.           ArgIterator iterator = new ArgIterator(__arglist);  
  4.           return iterator.GetRemainingCount();  

下面我調(diào)用這個(gè)函數(shù):

  1. int x = this.paramLength(__arglist(49,34,54,6,"Manimoy")); // returns 5 

變量x將返回5,因?yàn)槲覀儼l(fā)送了5個(gè)參數(shù)給函數(shù),我們可以使用下面的方法訪問每一個(gè)函數(shù):

  1. TypedReference tf = iterator.GetNextArg();  
  2. TypedReference.ToObject(tf) 

每調(diào)用一次GetNextArg,GetRemainingCount就會(huì)減少1,直到每個(gè)對(duì)象設(shè)置的迭代次數(shù)用完。

2、__refvalue

__refvalue從一個(gè)引用對(duì)象匹配值,可以使用它從TypedReference對(duì)象中獲得真實(shí)的對(duì)象,它需要兩個(gè)參數(shù),一個(gè)是TypedReference對(duì)象,一個(gè)是要轉(zhuǎn)換的類型,看下面的代碼:

  1. int tfValue = __refvalue(tf, int); 

執(zhí)行后tfValue將被分配tf指向的整數(shù)值。

3、__makeref

__makeref可以從對(duì)象自身中提取出TypedReference對(duì)象,它和__refvalue剛剛相反,來看下面的代碼:

  1. string name = "Ayan";  
  2. TypedReference tf = __makeref(name); 

4、__reftype

__reftype用于從TypedReference獲取Type對(duì)象,看下面的代碼你就知道怎么回事了:

  1. Type t = __reftype(tf);  
  2. if(t.ToString().equals("System.String"))  
  3. string str = __refvalue(t,string); 

注意:雖然我在所有C#版本中都發(fā)現(xiàn)了這些關(guān)鍵字,但我并沒有將它們用于生產(chǎn)環(huán)境,我不能保證這些關(guān)鍵字在今后的版本是否會(huì)仍然存在,使用風(fēng)險(xiǎn)一切由你自行承擔(dān)。

有文檔記載但用得很少的C#關(guān)鍵字

在這一部分我們將見到一些有文檔記載但在編程中很少用到的關(guān)鍵字。

1、Yield

Yield是.Net 2.0中引入的一個(gè)關(guān)鍵字,用于產(chǎn)生以IEnumerable形式返回的語句,產(chǎn)生IEnumerable的塊叫做迭代塊。在下面的代碼中,我創(chuàng)建了一列名單,返回長度小于5的名單,直到長度大于12時(shí)跳轉(zhuǎn)到y(tǒng)ield break語句。

  1. List lst = new List();  
  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;  

實(shí)際上yield return x會(huì)評(píng)估每個(gè)元素,并創(chuàng)建所有符合條件(長度小于5)元素的enumerable,break語句將會(huì)終止循環(huán),返回現(xiàn)有的Enumerable。

2、Fixed

Fixed只能用于Unsafe C#代碼塊,F(xiàn)ixed語句設(shè)置指針到一個(gè)固定的內(nèi)存地址,因此被固定到內(nèi)存中,即使垃圾回收線程也拿它沒辦法,來看下面的代碼:

  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.   

在這里指針c分配的位置的pt相同。它真正會(huì)對(duì)正常的垃圾回收進(jìn)程產(chǎn)生限制,因此如果不需要最好不要使用它。

3、Checked / Unchecked

Checked用于控制算法溢出,當(dāng)一個(gè)算術(shù)運(yùn)算溢出了必需的大小時(shí),Checked關(guān)鍵字會(huì)拋出一個(gè)StackOverflowException異常??聪旅娴拇a:

  1. int x = int.MaxValue;  
  2. int y = int.MaxValue;  
  3. int z = checked(x + y); 

當(dāng)調(diào)用x+y時(shí)上面的語句拋出StackOverflowException異常,checked用于檢查算術(shù)運(yùn)算溢出,并拋出相應(yīng)的異常,當(dāng)StackOverflowException發(fā)生時(shí)z被賦予值0。

當(dāng)我們不需要拋出異常時(shí)可以使用unchecked關(guān)鍵字。

  1. int x = int.MaxValue;  
  2. int y = int.MaxValue;  
  3. int z = unchecked(x + y); 

執(zhí)行上面的代碼z將被賦予值-2。

4、Volatile

Volatile關(guān)鍵字用于定義不調(diào)用lock語句跨多線程修改的變量,Volatile變量不接受編譯器優(yōu)化,因此我們將得到變量最新的值,看下面的例子:

  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. private void VolatileInvoke()  
  8. {  
  9.    while (true)  
  10.    {  
  11.          i++;  
  12.    }  

線程啟動(dòng)后值將按1遞增,直到被主線程取消。

注意:Volatile類型不具有線程優(yōu)化。

5、StackAlloc

它也使用unsafe C#代碼從堆棧中動(dòng)態(tài)分配內(nèi)存,stackalloc用于快速獲得大內(nèi)存,我們可以聲明一個(gè)數(shù)組:

  1. int* array = stackalloc new int[1000] 

當(dāng)這個(gè)語句被調(diào)用時(shí)內(nèi)存就分配好了。

不常見的C#關(guān)鍵字小結(jié)

關(guān)鍵字就介紹到這里,我只是為大家簡單地做了介紹和舉例,詳細(xì)的使用還得靠你自己去琢磨,有什么想法請(qǐng)發(fā)表你的意見。

原文:UnCommon C# keywords - A Look

作者:Abhishek Sur

【編輯推薦】

  1. C# 4.0 Dynamic關(guān)鍵字全解析
  2. 淺談C#增加that關(guān)鍵字
  3. C#讀取TXT文件的代碼實(shí)現(xiàn)
  4. C#讀取配置文件淺析
  5. C#讀取TXT文件圖解
責(zé)任編輯:彭凡 來源: 51CTO
相關(guān)推薦

2009-08-21 14:58:56

C# this關(guān)鍵字

2013-08-26 15:19:44

應(yīng)用商店AppStore關(guān)鍵字選取

2010-09-07 11:28:15

SQL語句

2009-09-02 09:24:03

C# this關(guān)鍵字

2011-07-07 17:17:23

Objective-C

2009-08-06 17:52:23

C#增加that關(guān)鍵字

2009-08-13 17:44:34

C# using關(guān)鍵字

2009-08-21 14:47:59

C# base關(guān)鍵字

2009-08-26 15:16:29

C# lock關(guān)鍵字

2009-08-13 13:04:29

C# lock關(guān)鍵字

2013-08-26 14:58:48

App Store關(guān)鍵字優(yōu)化App營銷

2009-08-21 14:16:35

C# New關(guān)鍵字

2011-06-21 09:50:51

volatile

2009-09-01 15:25:04

C# default關(guān)

2009-07-31 16:34:17

dynamicC# 4.0

2011-07-05 11:24:52

SQL語句索引

2024-12-26 00:28:59

C#base?關(guān)鍵字

2024-06-04 17:02:38

newC#編程語言

2009-08-13 16:41:12

C#結(jié)構(gòu)

2022-03-22 07:38:00

SQL語句MySQL
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)