亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C#: in ,out, ref 到底有沒用的深入分析

2019-11-14 11:56:46
字體:
來源:轉載
供稿:網友

C#.net 提供的3個關鍵字,in,out,ref開發中會經常用到,那么它們3個如何使用呢,又有什么區別,我查了下csdn和知乎的總結,都有點老了,說的也不細致。我盡量通過代碼示例寫的言簡意賅寫。

1 in in只用在委托和接口中; 例子:

//測試模型 class Model { public int a { get; set; } public Model(int a) { this.a = a; } }//創建3個實例List<Model> modelList= new List<Model>() { new Model(1), new Model(4), new Model(6) };//調用foreach接口,試著操作3個實例,賦值為nullmodelList.ForEach(e=>e=null); //查看結果://modelList的取值不變。

分析原因,ForEach的參數是委托函數:

//ForEach方法:public void ForEach(Action<T> action);//委托聲明:public delegate void Action<in T>(T obj);

委托是泛型的,類型T前加了一個關鍵字in,因為帶有關鍵字in,所以T obj是不能被修改的。

嘗試測試:

//修改元素e的屬性amodelList.ForEach(e=>{e.a*=2;});

結果每個元素都乘以2,變為2,8,12??芍?,可以修改對象的屬性。

2 out

out 關鍵字用法注意: 1)帶有out的形參,在函數定義時,return前必須給函數賦一個值。 2)調用函數時,帶有out的參數不必賦一個初始值。 3)out形參傳值是通過引用(by reference)

out使用場景: 在函數返回多個值時,通常用out 返回其中一個

public bool Operation(out Model updateMod){ updateMode = new Model(5); try{ // my operation ... // return true; } catch{ //寫入日志 return false; }}//使用Model um; //未初始化bool rtnMsg = Operation(out um); //如果初始化,傳值通過reference//分析://返回um,如果rntMsg為ture,則um按照預想邏輯被賦值,//如果rntMsg為false 則um未按照預想邏輯被賦值。

3 ref

ref關鍵字用于改變參數傳遞,將by value修改為by reference傳值,原來是by reference傳遞的,加上ref還是不加ref,效果是一樣的。

例如:

public void reviseModel(int a){ a = 12;}Model model = new Model(10);//調用reviseModelreviseModel(model.a); //model.a仍然=10;by-valuereviseMode(ref model.a); //編譯不過,提示ref后的參數不歸類與變量int a;reviseMode(ref a); //如果不給變量a賦一個初始值,//編譯器也是提示:調用前未被賦值的錯誤//因此賦值int a= model.a; //變量a初始值為10;reviseMode(ref a);//修改變量a=12;但是model.a的值仍然為10

如何修改對象model中的屬性a,將其變為12呢?

//直接將參數設為Model對象,則函數調用時,傳值通過by referencepublic void reviseModel(Model md){ md.a = 12;}reviseModel(model );//傳值通過by reference

因此,ref關鍵詞使用總結: ref的話,用于處理值變量,如基本類型、結構等,它們不需要被new出來,傳值依照的是值拷貝。

1)ref 后的變量,如果是值類型(value type),那么加上ref后變為按照 by reference傳值;

2)ref 后的變量,如果是引用類型(reference type),那么加上ref與不加沒有任何區別;

3)ref后的變量,使用前必須賦值

4)ref后的變量不能是引用類型的屬性

以上是基本的分析,在使用中就夠了,如果想更深入的分析這個問題,請繼續。

4 深入探討out ref

主要分析out ref 到底有何用,不用他們會有什么影響。

1) C#中有一類方法,名字叫作Try…,如Int.TryParse,它返回一個bool值,嘗試解析一個字符串,如果成功解析為整數,則返回true,得到的整數作為第二個out的int被傳出。 見分析文章 異常設計準則 DateTime.TryParse和Parse 從文章中看出,相比沒有out參數的次方法Parse,如果解析字符串失敗,則會拋出一個參數錯誤的異常。

用Try…方法寫出來的代碼比try…catch寫出來的要簡潔,于是這也變成了out參數使用的一個常用場景。

2) java和C#比較

在Java里,HashMap

// HashMap<K, V> map;// K key;V val = map.get(key);if (val != null) { // ...}

但val == null,既可能是該map里尚未有鍵為該key的鍵值對,也可能是已經有該鍵值對了但是其值為null。 要區分兩者,HashMap提供了containsKey()方法。所以正確的寫法是這樣的:

// HashMap<K, V> map;// K key;if (map.containsKey(key)) { V val = map.get(key); // ...}

containsKey()跟get()的內部操作幾乎是一模一樣的,都要做一次hash查找,只是返回了查找結果的不同部分而已。也就是說按照這種“正確寫法”來寫的話,訪問一次HashMap就有雙倍開銷了。杯具!

C#有許多這種細節設計比Java更貼心??碈#用out關鍵詞如何改進這個問題。

System.Collections.Generic.Dictionary

TryGetValue:Dictionary(TKey, TValue).TryGetValue Method (TKey, TValue) (System.Collections.Generic)public bool TryGetValue( TKey key, out TValue value)ParameterskeyType: TKeyThe key of the value to get.valueType: TValue

利用這個方法,上面的Java代碼對應的C#版就可以寫成:

// Dictionary<TKey, TValue> dict;// TKey key;TValue val;if (dict.TryGetValue(key, out val)) { // ...}

這就把ContainsKey與Item[Key]的語義結合了起來,把一次hash查找能找到的信息一口氣都返回出來,從源頭上避免了“兩次查找”的冗余操作,有利于程序的性能。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品91久久| 欧美色videos| 欧美亚洲视频一区二区| 日本在线观看天堂男亚洲| 午夜精品理论片| 国产精品中文字幕在线| 一区二区三区四区精品| 国产成人精品免费视频| 亚洲美女在线看| 91久久精品国产91性色| 欧美性videos高清精品| 这里只有精品丝袜| 亚洲国产精品久久久| 亚洲一区二区三区xxx视频| 久久久久久这里只有精品| 日韩黄色av网站| 亚洲成年人在线播放| 伊人伊人伊人久久| 欧美在线观看日本一区| 综合网日日天干夜夜久久| 日韩美女激情视频| 国产mv免费观看入口亚洲| 日韩精品中文字幕在线播放| xvideos亚洲人网站| 国产精品日日摸夜夜添夜夜av| 疯狂欧美牲乱大交777| 日韩av手机在线看| 久久精品色欧美aⅴ一区二区| 91久久久久久国产精品| 91情侣偷在线精品国产| 中文日韩在线视频| 日韩乱码在线视频| 久久影院中文字幕| 懂色av影视一区二区三区| 国产成人精品一区二区| 亚洲国产毛片完整版| 亚洲男女自偷自拍图片另类| 亚洲国产成人爱av在线播放| 欧美乱大交xxxxx| 国产精品久久久久久久久久久久久| 青青草原成人在线视频| 中文字幕精品久久久久| 精品亚洲国产成av人片传媒| 亚洲精品99久久久久| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲视频在线观看网站| 亚洲男人天天操| 国产精品一区电影| 青青a在线精品免费观看| 久久久久中文字幕2018| 欧美久久精品一级黑人c片| 久青草国产97香蕉在线视频| 国产精品午夜视频| 欧美一级片在线播放| 国产精品视频一区二区高潮| 欧美日韩成人黄色| 亚洲三级黄色在线观看| 久久久久久久久久国产精品| 色在人av网站天堂精品| 欧美性猛交xxxx免费看久久久| 国产一区二区三区在线| 欧美国产乱视频| 97国产精品人人爽人人做| 日韩电视剧免费观看网站| 91国产视频在线播放| 国产丝袜高跟一区| 2019中文字幕在线免费观看| 欧美日韩一区二区三区在线免费观看| 国模精品一区二区三区色天香| 久久久久久香蕉网| 96精品久久久久中文字幕| 国产91色在线免费| 欧美午夜久久久| 九色精品美女在线| 日韩av中文字幕在线| 日韩国产一区三区| 成人网在线观看| 亚洲电影免费观看高清完整版在线| 亚洲在线视频观看| 色老头一区二区三区在线观看| 欧美成年人网站| 亚洲国产中文字幕在线观看| 国产精品亚洲精品| 精品欧美国产一区二区三区| 亚洲精品日韩激情在线电影| 国产精品吹潮在线观看| 国产亚洲欧美日韩美女| 欧美日韩亚洲成人| 美女扒开尿口让男人操亚洲视频网站| 国产精品自产拍在线观看中文| 在线色欧美三级视频| 久久九九精品99国产精品| 国内精品久久久久久久| 亚洲自拍小视频免费观看| 九九综合九九综合| 国内精品国产三级国产在线专| 亚洲国产精品yw在线观看| 国产91精品久久久久久| 日韩精品在线电影| 国产日韩欧美视频在线| 丝袜亚洲欧美日韩综合| 国产日韩欧美一二三区| 欧美亚洲国产成人精品| 欧美成人精品xxx| 91手机视频在线观看| 欧美性做爰毛片| 一区二区三区四区在线观看视频| 中文字幕国产亚洲| 91欧美视频网站| 日韩美女视频免费在线观看| 久久精品视频99| 欧美另类高清videos| 9.1国产丝袜在线观看| 国产suv精品一区二区三区88区| 国产91色在线|免| 亚洲欧美日韩精品久久| 国产精品成人av性教育| 亚洲欧洲日产国码av系列天堂| 欧美激情视频三区| 亚洲欧美国产一区二区三区| 亚洲精品成人免费| 中文字幕在线看视频国产欧美在线看完整| 国产欧亚日韩视频| 亚洲欧美国产视频| 国产不卡av在线免费观看| 国产精品中文在线| 久久成年人免费电影| 日韩大片免费观看视频播放| 久久这里只有精品99| 久久国产加勒比精品无码| 国产成人精品久久久| 欧美激情一区二区三区高清视频| 欧美黑人狂野猛交老妇| 欧美亚州一区二区三区| 一本色道久久综合亚洲精品小说| 国产精品电影一区| 欧美大荫蒂xxx| 97超视频免费观看| 亚洲影视九九影院在线观看| 7777kkkk成人观看| 亚洲午夜未满十八勿入免费观看全集| 国产精品一区二区三区久久| 97视频网站入口| 另类美女黄大片| 在线观看免费高清视频97| 欧美激情va永久在线播放| 性色av一区二区三区免费| 国产视频精品xxxx| 色偷偷88888欧美精品久久久| 久久久久久久国产精品| 欧美成人免费在线观看| 亚洲伊人第一页| 亚洲欧美激情一区| 成人福利网站在线观看11| 国产在线观看不卡| 国产精品免费久久久久影院| 一区二区三区美女xx视频| 91在线无精精品一区二区| 国产视频在线一区二区| 国内揄拍国内精品少妇国语| 亚洲欧洲av一区二区| 精品久久久91| 久久视频在线观看免费| 午夜精品一区二区三区在线|