日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

关于.NET参数传递方式的思考

發布時間:2025/3/21 asp.net 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于.NET参数传递方式的思考 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ?年關將近,整個人已經沒有了工作和寫作的激情,估計這個時候很多人跟我差不多,該相親的相親,該聚會喝酒的聚會喝酒,總之就是沒有了干活的心思(我有很多想法,但就是叫不動我的手腳,所以我只能看著別人在做我想做的事,吃我想吃的東西。)。本人由上個月的每周四五篇,到現在的文章縮短到每周一篇,說個實話,現在的一篇也有不想寫的心思了(這一篇還是咬著牙寫的,感覺實在是寫不動了,寫博客太折騰人了,誰寫誰知道啊!),不過還是希望寫出來可以幫到大家,如有寫的不足的地方,還望大家多多指正,知識在于總結和反思,對別人也對自己都是一個提高。 ?

? ?這里先來一段廢話,緩和一下氣氛,免得讓大家很尷尬(太直接了還是不太好,總不能見到喜歡的女生就表白吧,還得多多的相處,讓人覺得你穩重有深度。),現在進入我們今天的博客內容,那就是.NET的參數用法。因為在.NET的參數用法和約束特別多,對于很多初學者來說,這樣繁多的參數用戶簡直就是跟扯淡一樣,即使對于是擁有豐富經驗的開發者來說,也未必能夠很輕松使用所有的參數用法和選擇合適的參數類型。談到參數,估計很多人就只是想著我們在一般的方法調用中使用的那樣,如string,int,object等等類型,更多的也就沒有了印象,就是知道,也就是在遇到了再去查看一下,這樣其實也沒錯,畢竟不能話費過多的時間用在哪些不常用的知識上,但是我個人覺得對于知識還是需要提前有一個全面的學習,可能具體的細節不能很好的把握,但是對于全局的概念還是得有一個整體的學習。

? ?下面就簡單的介紹一下.NET的一些常用參數用法,如有不足還望指正,也歡迎大家在下面留言討論,分享自己的見解。

一.DotNet參數概述:

? ? .NET中參數(形式參數)變量是方法或索引器聲明的一部分,而實參是調用方法或索引器時使用的表達式。

? ? 在CLR中,默認的情況下所有的方法參數都是傳值的。在傳遞引用類型的對象時,對一個對象的引用會傳遞給方法。這里的船引用本身是以傳值的方式傳給方法的。這也意味著方法能夠修改對象,而調用者能看到這些修改。對于值類型的實例,傳給方法的實例的一個副本。意味著方法將獲得它專用的一個值類型實例副本,調用者中的實例不受影響。

? ? 在CLR中允許以傳引用而非傳值的方式傳遞參數,在C#中使用out和ref來實現傳遞引用的方式傳值。在C#中使用out和ref來實現傳遞引用的方式傳值,這兩個關鍵字告訴編譯器生成元數據來指明該參數是傳引用的,編譯器將生成代碼來傳遞參數的地址,而不是傳遞參數本身。為值類型使用out和ref,效果等同于以傳值的方式傳遞引用類型。? ?

? ? 常用的參數主要有基本類型參數,泛型參數,以及<in T>和<out T>,dynamic等等。例如<in T>和<out T>,在CLR中支持泛型類型的可變性,C#在4.0時獲得了生命泛型遍體所必須的語法,并且現在編譯器也能夠知道接口和委托可能的轉換??勺冃允且砸环N類型安全的方式,講一個對象作為另一個對象來使用??勺冃詰糜诜盒徒涌诤头盒臀械念愋蛥抵小f變形用于向調用者返回某項操作的值;逆變性是指調用者想API傳入值;不變性是相對于協變性和逆變性,是指什么也不會發生。對于這方面的知識非常的豐富,有興趣的可以自行了解,這里就不做詳細的介紹了。dynamic類型,C#是一門靜態類型的語言,在某些情況下,C#編譯器要尋找特定的名稱而不是接口。dynamic可以在編譯時做任何事,到執行時再由框架進行處理。有關動態類型的介紹也不做更深入的介紹。

? ? 在.NET中參數的使用方法主要為可選參數、命名參數、可變數量參數等等。本文下面也是主要介紹這三種參數的使用方法。

二.DotNet參數用法:

? ? 以下是主要介紹三種參數的用法:可選參數;命名實參;傳遞可變數量的參數。 ??

? ?1.可選參數:

? ? ?(1).基本用法:

? ? ? ? 如果某個操作需要多個值,而有些值在每次調用的時候又往往是相同的,這時通常可以使用可選參數。在C#以前實現可變參數的功能,往往聲明一個包含所有可能參數的方法,其他方法調用這個方法,并傳遞恰當的默認值。

? ? ? ? 在可選參數中,設計一個方法的參數時,可以為部分或全部參數分配默認值。在調用這些方法代碼可以選擇不指定部分實參,接受默認值。還可以在調用方法時,還可以通過指定參數名稱的方式為其傳遞實參。如下實例:

static void OptionalParameters(int x, int y = 10, int z = 20){Console.WriteLine("x={0} y={1} z={2}",x,y,z);}OptionalParameters(1, 2, 3);OptionalParameters(1, 2);OptionalParameters(1);

? ? ?以上的例子可以很清楚的看到其用法,int y=10和int z=20這兩個參數就是可選參數??蛇x參數的使用中,如果調用時省略了一個參數,C#編譯器會自動嵌入參數的默認值。向方法傳遞實參時,編譯器按從左向右的順序對實參進行求值。使用已命名的參數傳遞實參時,編譯器仍然按照從左到右的順序對實參進行求值。

? ? ? (2).基本原則:

? ? ? ?可選參數包含一些規范,具體的一些要求如下:

    (a).所有可選參數必須出現在必備參數之后,參數數組(使用params修飾符聲明)除外,但他們必須出現在參數列表的最后,在他們之前是可選參數。

    (b).參數數組不能聲明為可選的,如果調用者沒有指定值,將使用空數組代替。

    (c).可選參數不能使用ref和out修飾符。

    (d).可選參數可以為任何類型,但對于指定的默認值卻有一些限制,那就是默認值必須為常量(數字或字符串字面量、null、const成員、枚舉成員、default(T)操作符)。

    (e).指定的值會隱式轉換為參數類型,但是這種轉換不能是用戶定義的。

    (f).可以為方法、構造器、有參屬性的參數指定默認值,還可以為屬于委托定一部分的參數指定默認值。

    (g).C#不允許省略逗號之間的實參。

? ? ? 在使用可選參數時,對于引用類型使用null來做默認值,如果參數類型是值類型,只需要使用相應的可空值類型作為默認值。

? ? ? (3).代碼示例:

/// <summary>/// 提取異常及其內部異常堆棧跟蹤/// </summary>/// <param name="exception">提取的例外</param>/// <param name="lastStackTrace">最后提取的堆棧跟蹤(對于遞歸), String.Empty or null</param>/// <param name="exCount">提取的堆棧數(對于遞歸)</param>/// <returns>Syste.String</returns>public static string ExtractAllStackTrace(this Exception exception, string lastStackTrace = null, int exCount = 1){while (true){var ex = exception;const string entryFormat = "#{0}: {1}\r\n{2}";lastStackTrace = lastStackTrace ?? string.Empty;lastStackTrace += string.Format(entryFormat, exCount, ex.Message, ex.StackTrace);if (exception.Data.Count > 0){lastStackTrace += "\r\n Data: ";lastStackTrace = exception.Data.Cast<DictionaryEntry>().Aggregate(lastStackTrace, (current, entry) => current + $"\r\n\t{entry.Key}: {exception.Data[entry.Key]}");}//遞歸添加內部異常if ((ex = ex.InnerException) == null) return lastStackTrace;exception = ex;lastStackTrace = $"{lastStackTrace}\r\n\r\n";exCount = ++exCount;}}

? ?2.命名實參:

? ? ? ? ?以上講解了可選參數的一些基本概念和用法,接下來看一下命名參數的相關操作用法:

? ? ??(1).基本用法:

? ? ? ? ? 命名實參是指在指定實參的值時,可以同時指定相應的參數名稱。編譯器將判斷參數的名稱是否正確,并將指定的值賦給這個參數。命名參數在各個實參之前加上它們的參數名稱以及一個冒號。如下代碼:

new StreamWriter(path:filename,aooend:true,encoding:realEncoding);

?如果要對包含ref和out的參數指定名稱,需要將ref和out修飾符放在名稱之后,實參之前。

int number; bool success=int.TryParse("10",result:out number);

? ? ??(2).基本原則:

? ? ? ? 在命名參數中,所有的命名參數必須位于位置實參之后,兩者之間的位置不能改變。位置實參總是指向方法聲明中相應的參數,不能跳過參數之后,在通過命名相應位置的實參來指定。實參仍然按編寫順序求值,即使這個順序有可能會不同于參數的聲明順序。

? ? ? ? 在一般情況下,可選參數與命名實參會一起配合使用??蛇x參數會增加適用方法的數量,而命名實參會減少使用方法的數量。為了檢查是否存在特定的適用方法,編譯器會使用位置參數的順序構建一個傳入實參的列表,然后對命名實參和剩余的參數進行匹配。如果沒有指定某個必備參數,或某個命名實參不能與剩余的參數相匹配,那么這個方法就不是適用的。

? ? ? ?命名實參有時可以代替強制轉換,來輔助編譯器進行重載決策。如果方法是從模塊的外部調用的,更改參數的默認值是具有潛在的危險的。可以按名稱將實參傳給沒有默認值的參數,但是編譯器要想編譯代碼,所有要求的實參都必須傳遞。

? ? ?? 在寫C#代碼與COM對象模型進行互操作時,C#的可選參數和命名參數功能是最好用的,調用一個COM組件時,為了以傳引用的方式傳遞一個實參,C#還允許省略REF/OUT,在嗲用COM組件時,C#要求必須向實參應用OUT.REF關鍵字。? ??

? ?3.傳遞可變數量的參數:

? ? ? 在項目開發中,有時我們需要定義一個方法來獲取可變數量的參數??梢允褂胮arams,params只能應用于方法簽名中的最后一個參數。params關鍵字告訴編譯器向參數應用System.ParamArrayAttribute的實例。我們具體看一下實現的代碼:

[AttributeUsage(AttributeTargets.Parameter, Inherited=true, AllowMultiple=false), ComVisible(true), __DynamicallyInvokable] public sealed class ParamArrayAttribute : Attribute {// Methods [__DynamicallyInvokable]public ParamArrayAttribute(); }[__DynamicallyInvokable] public ParamArrayAttribute() { }

? ? ?以上的代碼可以看出該類繼承自Attribute類,對于Attribute類可能不會陌生,那就是定義定制屬性的基類,說明ParamArrayAttribute類用于定義定制屬性,ParamArrayAttribute類在System命名空間下,ParamArrayAttribute類只有一個構造方法,沒有具體的實現。AttributeUsage也定義了屬性的使用方式。

? ? C#編譯器檢測到一個方法調用時,會檢查所有具有指定名稱、同時參數沒有應用ParamArrayAttribute的方法。如果找到一個匹配的方法,編譯器生成調用它所需的代碼。如果編譯器沒有找到一個匹配的方法,會直接檢查應用ParamArrayAttribute的方法。如果找到一個匹配的方法,編譯器會先生成代碼來構造一個數組,填充它的元素,再生成代碼來調用選定的方法。

? ? 調用一個參數數量可變的方法時,會造成一些額外的性能損失,數組對象必須在對上分配,數組元素必須初始化,而且數組的內存最終必須垃圾回收。

? ? 提供一個方法代碼,僅供參考:

/// <summary>/// 字符型二維數組轉換成DataTable /// </summary>/// <param name="stringDyadicArray"></param>/// <param name="messageOut"></param>/// <param name="dataTableColumnsName"></param>/// <returns></returns>public DataTable DyadicArrayToDataTable(string[,] stringDyadicArray, out bool messageOut,params object[] dataTableColumnsName){if (stringDyadicArray == null){throw new ArgumentNullException("stringDyadicArray");}var returnDataTable = new DataTable();if (dataTableColumnsName.Length != stringDyadicArray.GetLength(1)){messageOut = false;return returnDataTable;}for (var dataTableColumnsCount = 0;dataTableColumnsCount < dataTableColumnsName.Length;dataTableColumnsCount++){returnDataTable.Columns.Add(dataTableColumnsName[dataTableColumnsCount].ToString());}for (var dyadicArrayRow = 0; dyadicArrayRow < stringDyadicArray.GetLength(0); dyadicArrayRow++){var addDataRow = returnDataTable.NewRow();for (var dyadicArrayColumns = 0; dyadicArrayColumns < stringDyadicArray.GetLength(1);dyadicArrayColumns++){addDataRow[dataTableColumnsName[dyadicArrayColumns].ToString()] = stringDyadicArray[dyadicArrayRow, dyadicArrayColumns];}returnDataTable.Rows.Add(addDataRow);}messageOut = true;return returnDataTable;}

?? 以上給出了一個使用可變參數數量以及命名參數的使用樣例,完成了將二維字節數組轉化為DataTable對象,將數組進行遍歷,并將數組寫入datatable中,對于整個方法的邏輯就不做深入介紹,代碼比較的簡單。

三.與參數有關的一些指導原則:

? ? 聲明方法的參數類型時,應盡量指定最弱的類型,最好是接口而不是基類。

??? 在設計模式的基本原則中,迪米特法則也較最少知識原則,迪米特法則是指如果兩個類不必彼此直接通信,那么這兩個類就不應當直接的相互作用。如果其中一個類需要調用另一個類的某一個方法的話,可以通過第三者轉發這個調用。在類結構的設計上,每一個類都應當盡量降低成員的訪問權限。類之間的耦合度越弱,越有利于復用,一個處在弱耦合的類被修改,不會對有關系的類造成波及。

??? 對于參數的使用中,我們在對參數類型的使用上,還是需要很仔細和認真的去思考,因為在參數類型的定義上,在一定程度上影響著我們程序的擴展性和穩定性,如果參數類型的約束比較大,對于后續方法的擴展,意義是巨大的。在整個面向對象的語言體系中,一切設計模式都是由“多態”延伸而來,對于接口和委托都是在我們面向對象設計中使用很多的,目的較多的是在使用時擴大參數的約束性。

? ? 在方法的返回值類型中,返回的類型應該聲明為最強的類型,以免受限于特定的類型。

四.總結:

? ?以上是一篇簡單介紹方法參數的文章,在文章內容中主要對于介紹可選參數、命名參數等。以上的內容如果有不足的地方還望大家多多包涵,也希望能夠指出對應的問題。知識先于模范,后于反思。學習完一點后,需要我們去總結和反思,其中的內涵我們才會有時間和精力,以及由能力去思考。

總結

以上是生活随笔為你收集整理的关于.NET参数传递方式的思考的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久综合第一页 | 97人妻天天摸天天爽天天 | 精品一区二区三区入口 | 久一视频在线观看 | 少妇饥渴放荡91麻豆 | 国产精品视频一二区 | 我要看黄色大片 | 中文久久精品 | av片一区二区三区 | 成人免费看片入口 | 一边摸一边做爽的视频17国产 | 国产一区二区三区小说 | 久久精品久久久久久久 | 91久久精品无码一区二区 | 亚洲精品你懂的 | 青青草原亚洲视频 | 久久丫精品忘忧草西安产品 | 欧美极品一区二区 | 日日夜夜亚洲 | 亚洲黄片一区二区三区 | 日韩一级性生活片 | 欧美粗暴jizz性欧美20 | 色婷婷av一区二区三区软件 | 欧美人体一区二区三区 | 亚洲激情偷拍 | 日韩三级免费观看 | 日本一道在线 | 日本成人久久 | 青青草中文字幕 | 黑人操日本女优 | 男女污污网站 | 亚洲国产私拍精品国模在线观看 | 国产精品久久成人 | 中文字幕亚洲色图 | 国产精品成人免费 | 超碰成人免费电影 | 91成人在线观看喷潮 | 欧美福利一区二区 | 亚洲精品国产精品国自产网站 | 欧美一级免费视频 | 欧美jizzhd欧美18 | 丝袜人妻一区二区三区 | 特级毛片爽www免费版 | 自拍偷自拍亚洲精品播放 | 亚洲一区 在线播放 | 国产在线观看av | 欧美精品在线播放 | 亚洲青涩在线 | 亚洲欧美日韩视频一区 | 狠狠操狠狠 | 人妻丰满熟妇aⅴ无码 | 国产日韩欧美在线播放 | 国产精品国产精品国产 | 国产99久久久国产精品免费看 | 亚洲天堂网在线视频 | 国产成人精品视频在线观看 | 亚洲做受高潮无遮挡 | 亚洲成年人在线观看 | 亚洲欧美国产日韩精品 | 欧美日韩精品一区二区在线观看 | 国产精品毛片 | 国产jizz| 免费不卡视频 | 爽爽影院免费观看 | 日韩精品一线二线三线 | 午夜av片 | 久青草影视 | 欧美在线性视频 | 亚洲欧美福利 | 黄色片链接 | 亚洲一区二区福利视频 | 久久久久久亚洲中文字幕无码 | 男人免费视频 | 免费国产高清 | 免费无遮挡无码永久在线观看视频 | 一本一本久久a久久精品综合麻豆 | 欧美三级韩国三级日本三斤在线观看 | www日韩欧美 | 牛牛av| 日韩三级久久 | 蜜臀久久99精品久久久久久宅男 | 色综合天天网 | 亚洲av人人夜夜澡人人 | 黄色的网站在线观看 | 日本久久伊人 | 国产视频久久久久久 | 96免费视频| 一区久久久 | 日韩不卡一二区 | 99re超碰 | 亚洲av无码国产精品久久不卡 | 丁香花五月 | 国产精品久久无码一三区 | 日本在线成人 | 手机在线观看av片 | 亚洲黄v | 色欧美88888久久久久久影院 | 国产精品乱码久久久 | 国产欧美视频在线播放 |