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

站在用戶的角度思考問題,與客戶深入溝通,找到井陘網(wǎng)站設(shè)計與井陘網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名申請、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋井陘地區(qū)。
第二部分介紹有文檔記載但不常用的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用于向一個函數(shù)發(fā)送一個參數(shù),我們向函數(shù)發(fā)送參數(shù)的常規(guī)做法是在函數(shù)頭指定一個參數(shù)列表,如果要向函數(shù)追加一個新參數(shù),需要函數(shù)重載才行,如果要發(fā)送多個參數(shù),可以使用參數(shù)數(shù)組。
那么我們?yōu)槭裁匆褂胈_arglist呢?上面任何一種傳遞參數(shù)的方法都存在如下問題:
A) 如果我們使用函數(shù)重載,我們不得不為新增加的參數(shù)設(shè)計新的函數(shù)。
B) 如果我們使用參數(shù)數(shù)組,那參數(shù)類型必須相同,或者需要參數(shù)數(shù)組對象。
但__arglist不需要這么復(fù)雜,可以傳遞任何數(shù)量的參數(shù)給函數(shù),可以是任何的類型,讓我們看一段代碼:
- public int paramLength(__arglist)
- {
- ArgIterator iterator = new ArgIterator(__arglist);
- return iterator.GetRemainingCount();
- }
下面我調(diào)用這個函數(shù):
- int x = this.paramLength(__arglist(49,34,54,6,"Manimoy")); // returns 5
變量x將返回5,因為我們發(fā)送了5個參數(shù)給函數(shù),我們可以使用下面的方法訪問每一個函數(shù):
- TypedReference tf = iterator.GetNextArg();
- TypedReference.ToObject(tf)
每調(diào)用一次GetNextArg,GetRemainingCount就會減少1,直到每個對象設(shè)置的迭代次數(shù)用完。
2、__refvalue
__refvalue從一個引用對象匹配值,可以使用它從TypedReference對象中獲得真實的對象,它需要兩個參數(shù),一個是TypedReference對象,一個是要轉(zhuǎn)換的類型,看下面的代碼:
- int tfValue = __refvalue(tf, int);
執(zhí)行后tfValue將被分配tf指向的整數(shù)值。
3、__makeref
__makeref可以從對象自身中提取出TypedReference對象,它和__refvalue剛剛相反,來看下面的代碼:
- string name = "Ayan";
- TypedReference tf = __makeref(name);
4、__reftype
__reftype用于從TypedReference獲取Type對象,看下面的代碼你就知道怎么回事了:
- Type t = __reftype(tf);
- if(t.ToString().equals("System.String"))
- string str = __refvalue(t,string);
注意:雖然我在所有C#版本中都發(fā)現(xiàn)了這些關(guān)鍵字,但我并沒有將它們用于生產(chǎn)環(huán)境,我不能保證這些關(guān)鍵字在今后的版本是否會仍然存在,使用風(fēng)險一切由你自行承擔(dān)。
有文檔記載但用得很少的C#關(guān)鍵字
在這一部分我們將見到一些有文檔記載但在編程中很少用到的關(guān)鍵字。
1、Yield
Yield是.Net 2.0中引入的一個關(guān)鍵字,用于產(chǎn)生以IEnumerable形式返回的語句,產(chǎn)生IEnumerable的塊叫做迭代塊。在下面的代碼中,我創(chuàng)建了一列名單,返回長度小于5的名單,直到長度大于12時跳轉(zhuǎn)到y(tǒng)ield break語句。
- List lst = new List();
- 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 > 12) // Breaks on MacMillanRojer
- yield break;
- else if (x.Length > 5) // Only returns those which are having length >5
- yield return x;
- else continue;
- }
實際上yield return x會評估每個元素,并創(chuàng)建所有符合條件(長度小于5)元素的enumerable,break語句將會終止循環(huán),返回現(xiàn)有的Enumerable。
2、Fixed
Fixed只能用于Unsafe C#代碼塊,F(xiàn)ixed語句設(shè)置指針到一個固定的內(nèi)存地址,因此被固定到內(nèi)存中,即使垃圾回收線程也拿它沒辦法,來看下面的代碼:
- int[] a = new int[] { 1, 2, 3 };
- 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相同。它真正會對正常的垃圾回收進程產(chǎn)生限制,因此如果不需要最好不要使用它。
3、Checked / Unchecked
Checked用于控制算法溢出,當(dāng)一個算術(shù)運算溢出了必需的大小時,Checked關(guān)鍵字會拋出一個StackOverflowException異常??聪旅娴拇a:
- int x = int.MaxValue;
- int y = int.MaxValue;
- int z = checked(x + y);
當(dāng)調(diào)用x+y時上面的語句拋出StackOverflowException異常,checked用于檢查算術(shù)運算溢出,并拋出相應(yīng)的異常,當(dāng)StackOverflowException發(fā)生時z被賦予值0。
當(dāng)我們不需要拋出異常時可以使用unchecked關(guān)鍵字。
- int x = int.MaxValue;
- int y = int.MaxValue;
- int z = unchecked(x + y);
執(zhí)行上面的代碼z將被賦予值-2。
4、Volatile
Volatile關(guān)鍵字用于定義不調(diào)用lock語句跨多線程修改的變量,Volatile變量不接受編譯器優(yōu)化,因此我們將得到變量最新的值,看下面的例子:
- public volatile int i;
- Thread th = new Thread(new ThreadStart(VolatileInvoke));
- th.Start();
- Thread.Sleep(5000); //Holds current Thread for 5 seconds.
- MessageBox.Show("Value of i : " + i);
- th.Abort();
- private void VolatileInvoke()
- {
- while (true)
- {
- i++;
- }
- }
線程啟動后值將按1遞增,直到被主線程取消。
注意:Volatile類型不具有線程優(yōu)化。
5、StackAlloc
它也使用unsafe C#代碼從堆棧中動態(tài)分配內(nèi)存,stackalloc用于快速獲得大內(nèi)存,我們可以聲明一個數(shù)組:
- int* array = stackalloc new int[1000]
當(dāng)這個語句被調(diào)用時內(nèi)存就分配好了。
不常見的C#關(guān)鍵字小結(jié)
關(guān)鍵字就介紹到這里,我只是為大家簡單地做了介紹和舉例,詳細(xì)的使用還得靠你自己去琢磨,有什么想法請發(fā)表你的意見。
原文:UnCommon C# keywords - A Look
作者:Abhishek Sur
分享名稱:一些不常見的C#關(guān)鍵字介紹
分享URL:http://m.fisionsoft.com.cn/article/dhejodj.html


咨詢
建站咨詢
