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

.Net方法概述和分類

開發(fā) 后端
“方法”是包含一系列語句的代碼塊。在 C# 中,每個(gè)執(zhí)行指令都是在方法的上下文中完成的。方法在類或結(jié)構(gòu)中聲明,聲明時(shí),聲明時(shí)需要指定訪問級(jí)別、返回值、方法名稱以及任何方法參數(shù)。

.Net方法概述

  • 方法

     “方法”是包含一系列語句的代碼塊。在 C# 中,每個(gè)執(zhí)行指令都是在方法的上下文中完成的。方法在類或結(jié)構(gòu)中聲明,聲明時(shí),聲明時(shí)需要指定訪問級(jí)別、返回值、方法名稱以及任何方法參數(shù)。方法參數(shù)放在括號(hào)中,并用逗號(hào)隔開??绽ㄌ?hào)表示方法不需要參數(shù)。方法可以有或沒有參數(shù),也可以有或沒有返回值。

  • Main方法

     Main 方法是控制臺(tái)應(yīng)用程序或窗口應(yīng)用程序的入口點(diǎn)。Main 方法是 .exe 程序的入口點(diǎn),程序控制流在該處開始和結(jié)束。Main 在類或結(jié)構(gòu)內(nèi)聲明,Main 必須是靜態(tài)的,且不應(yīng)該是公用的,但不要求封閉類或結(jié)構(gòu)是靜態(tài)的。Main 的返回類型有兩種:void 或 int。所聲明的 Main 方法可以具有包含命令行實(shí)參的 string[] 形參,也可以不具有這樣的形參。使用 Visual Studio 創(chuàng)建 Windows 窗體應(yīng)用程序時(shí),可以手動(dòng)添加形參,也可以使用 Environment 類獲取命令行實(shí)參。 形參讀取為從零開始編制索引的命令行實(shí)參。與 C 和 C++ 不同,在 C# 中不將程序名稱視為第一個(gè)命令行實(shí)參。

  • 重載

     定義一組名字相同的成員,但他們的參數(shù)數(shù)量或類型不同。

  • 參數(shù)

     對(duì)于被調(diào)用的方法,傳入的變量稱為“參數(shù)”。方法所接收的參數(shù)也是在一組括號(hào)中提供的,但必須指定每個(gè)參數(shù)的類型和名稱。該名稱不必與參數(shù)相同。

  • 參數(shù)修飾符
    • 無:值傳遞,原始數(shù)據(jù)的一份副本
    • out:引用傳遞,方法未給該參數(shù)賦值會(huì)出現(xiàn)編譯錯(cuò)誤
    • ref:引用傳遞,方法未給該參數(shù)賦值也不會(huì)出現(xiàn)編譯錯(cuò)誤
    • params:允許將一組可變數(shù)量的參數(shù)作為單獨(dú)的邏輯參數(shù)進(jìn)行傳遞,方法中只能有一個(gè)params,必須是方法中的最后一個(gè)參數(shù)
  • 參數(shù)傳遞
    • 值傳遞(默認(rèn))
      • 值類型:傳遞的是數(shù)據(jù)值的副本
    • 引用傳遞
      • out
      • ref
  • 可選參數(shù)

     指定參數(shù)的默認(rèn)值,默認(rèn)值必須在編譯時(shí)確定而不能在運(yùn)行時(shí)確定,只能放在方法參數(shù)的最后。

  • 命名參數(shù)調(diào)用方法

     使用命名參數(shù)可以在方法調(diào)用時(shí)更換參數(shù)的順序。

  • 返回值

方法可以向調(diào)用方返回值。如果返回類型(方法名稱前列出的類型)不是 void,則方法可以使用 return 關(guān)鍵字來返回值。

  • 返回值修飾符
    • 無返回值:void
    • 有返回值:返回值的類型名
  • 方法簽名
    • 訪問修飾符
      • private:私有的,類本身才能訪問
      • protected:受保護(hù)的,類本身及派生類可訪問
      • internal:內(nèi)部的,同一程序集內(nèi)部類型才能訪問
      • public:公共的,內(nèi)部與外部都可以訪問
    • 可選修飾符
      • irtual:虛擬的
      • static:靜態(tài)的
      • abstract:抽象的
      • sealed:封閉的
      • override:繼承的

#p#

 .NET 泛型方法

  • 泛型方法

 泛型方法是使用類型參數(shù)聲明的方法。

  1. static void Swap<T>(ref T lhs, ref T rhs) 
  2.     T temp; 
  3.     temp = lhs
  4.     lhs = rhs
  5.     rhs = temp
  • 類型推斷

相同的類型推斷規(guī)則也適用于靜態(tài)方法以及實(shí)例方法。編譯器能夠根據(jù)傳入的方法參數(shù)推斷類型參數(shù);它無法僅從約束或返回值推斷類型參數(shù)。因此,類型推斷不適用于沒有參數(shù)的方法。類型推斷在編譯時(shí)、編譯器嘗試解析任何重載方法簽名之前進(jìn)行。編譯器向共享相同名稱的所有泛型方法應(yīng)用類型推斷邏輯。在重載解析步驟中,編譯器僅包括類型推斷取得成功的那些泛型方法。

  1. Swap(ref a, ref b); 
  • 非泛型方法使用泛型參數(shù)

在泛型類中,非泛型方法可以訪問類級(jí)別類型參數(shù)。

  1. class SampleClass<T> 
  2.     void Swap(ref T lhs, ref T rhs) { } 

 

  • 泛型類與泛型方法使用相同的泛型參數(shù)

 如果定義的泛型方法接受與包含類相同的類型參數(shù),編譯器將生成警告 CS0693,因?yàn)樵诜椒ǚ秶鷥?nèi),為內(nèi)部 T 提供的參數(shù)將隱藏為外部 T 提供的參數(shù)。除了類初始化時(shí)提供的類型參數(shù)之外,如果需要靈活調(diào)用具有類型參數(shù)的泛型類方法,請(qǐng)考慮為方法的類型參數(shù)提供其他標(biāo)識(shí)符,如下面示例中的 GenericList2<T> 所示。

  1. class GenericList<T> 
  2.     // CS0693 
  3.     void SampleMethod<T>() { } 
  4. class GenericList2<T> 
  5.     //No warning 
  6.     void SampleMethod<U>() { } 
  • 泛型約束

     使用約束對(duì)方法中的類型參數(shù)啟用更專門的操作。此版本的 Swap<T> 現(xiàn)在稱為 SwapIfGreater<T>,它只能與實(shí)現(xiàn) IComparable<T> 的類型參數(shù)一起使用。

  1. void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T> 
  2.     T temp; 
  3.     if (lhs.CompareTo(rhs) > 0) 
  4.     { 
  5.         temp = lhs
  6.         lhs = rhs
  7.         rhs = temp
  8.     } 
  • 方法重載

     泛型方法可以使用許多類型參數(shù)進(jìn)行重載。

  1. void DoWork() { } 
  2. void DoWork<T>() { } 
  3. void DoWork<T, U>() { }

#p#

.Net擴(kuò)展方法

  • 擴(kuò)展方法

擴(kuò)展方法使您能夠向現(xiàn)有類型“添加”方法,而無需創(chuàng)建新的派生類型、重新編譯或以其他方式修改原始類型。 擴(kuò)展方法是一種特殊的靜態(tài)方法,但可以像擴(kuò)展類型上的實(shí)例方法一樣進(jìn)行調(diào)用。 對(duì)于用 C# 和 Visual Basic 編寫的客戶端代碼,調(diào)用擴(kuò)展方法與調(diào)用在類型中實(shí)際定義的方法之間沒有明顯的差異。

通常,建議您只在不得已的情況下才實(shí)現(xiàn)擴(kuò)展方法,并謹(jǐn)慎地實(shí)現(xiàn)。 只要有可能,必須擴(kuò)展現(xiàn)有類型的客戶端代碼都應(yīng)該通過創(chuàng)建從現(xiàn)有類型派生的新類型來達(dá)到這一目的。

  • 限制條件
    • 必須定義在靜態(tài)類中
    • 必須使用this關(guān)鍵字對(duì)第一個(gè)參數(shù)進(jìn)行修飾
    • 每個(gè)擴(kuò)展方法只能被內(nèi)存中正確的實(shí)例和其所在的靜態(tài)類調(diào)用
  • 代碼示例
  1. namespace DefineIMyInterface 
  2.     using System; 
  3.     public interface IMyInterface 
  4.     { 
  5.         void MethodB(); 
  6.     } 
  7. namespace Extensions 
  8.     using System; 
  9.     using DefineIMyInterface; 
  10.     public static class Extension 
  11.     { 
  12.         public static void MethodA(this IMyInterface myInterface, int i) 
  13.         { 
  14.             Console.WriteLine 
  15.                 ("Extension.MethodA(this IMyInterface myInterface, int i)"); 
  16.         } 
  17.         public static void MethodA(this IMyInterface myInterface, string s) 
  18.         { 
  19.             Console.WriteLine 
  20.                 ("Extension.MethodA(this IMyInterface myInterface, string s)"); 
  21.         } 
  22.         public static void MethodB(this IMyInterface myInterface) 
  23.         { 
  24.             Console.WriteLine 
  25.                 ("Extension.MethodB(this IMyInterface myInterface)"); 
  26.         } 
  27.     } 
  28. namespace ExtensionMethodsDemo1 
  29.     using System; 
  30.     using Extensions; 
  31.     using DefineIMyInterface; 
  32.     class A : IMyInterface 
  33.     { 
  34.         public void MethodB() { Console.WriteLine("A.MethodB()"); } 
  35.     } 
  36.     class B : IMyInterface 
  37.     { 
  38.         public void MethodB() { Console.WriteLine("B.MethodB()"); } 
  39.         public void MethodA(int i) { Console.WriteLine("B.MethodA(int i)"); } 
  40.     } 
  41.     class C : IMyInterface 
  42.     { 
  43.         public void MethodB() { Console.WriteLine("C.MethodB()"); } 
  44.         public void MethodA(object obj) 
  45.         { 
  46.             Console.WriteLine("C.MethodA(object obj)"); 
  47.         } 
  48.     } 
  49.     class ExtMethodDemo 
  50.     { 
  51.         static void Main(string[] args) 
  52.         { 
  53.             A a = new A(); 
  54.             B b = new B(); 
  55.             C c = new C(); 
  56.             a.MethodA(1);           // Extension.MethodA(object, int) 
  57.             a.MethodA("hello");     // Extension.MethodA(object, string) 
  58.             a.MethodB();            // A.MethodB() 
  59.             b.MethodA(1);           // B.MethodA(int) 
  60.             b.MethodB();            // B.MethodB() 
  61.             b.MethodA("hello");     // Extension.MethodA(object, string) 
  62.             c.MethodA(1);           // C.MethodA(object) 
  63.             c.MethodA("hello");     // C.MethodA(object) 
  64.             c.MethodB();            // C.MethodB() 
  65.         } 
  66.     } 

#p#

.NET 分部方法

  • 分部方法

分部類或結(jié)構(gòu)可以包含分部方法。 類的一個(gè)部分包含方法的簽名。 可以在同一部分或另一個(gè)部分中定義可選實(shí)現(xiàn)。 如果未提供該實(shí)現(xiàn),則會(huì)在編譯時(shí)移除方法以及對(duì)方法的所有調(diào)用。

分部方法使類的某個(gè)部分的實(shí)施者能夠定義方法(類似于事件)。 類的另一部分的實(shí)施者可以決定是否實(shí)現(xiàn)該方法。 如果未實(shí)現(xiàn)該方法,編譯器將移除方法簽名以及對(duì)該方法的所有調(diào)用。 調(diào)用該方法,包括調(diào)用中的任何計(jì)算結(jié)果,在運(yùn)行時(shí)沒有任何影響。 因此,分部類中的任何代碼都可以隨意地使用分部方法,即使未提供實(shí)現(xiàn)也是如此。 如果調(diào)用了未實(shí)現(xiàn)的方法,將不會(huì)導(dǎo)致編譯時(shí)錯(cuò)誤或運(yùn)行時(shí)錯(cuò)誤。

在自定義生成的代碼時(shí),分部方法特別有用。 這些方法允許保留方法名稱和簽名,因此生成的代碼可以調(diào)用方法,而開發(fā)人員可以決定是否實(shí)現(xiàn)方法。 與分部類非常類似,分部方法使代碼生成器創(chuàng)建的代碼和開發(fā)人員創(chuàng)建的代碼能夠協(xié)同工作,而不會(huì)產(chǎn)生運(yùn)行時(shí)開銷。

分部方法聲明由兩個(gè)部分組成:定義和實(shí)現(xiàn)。 它們可以位于分部類的不同部分中,也可以位于同一部分中。 如果不存在實(shí)現(xiàn)聲明,則編譯器將優(yōu)化定義聲明和對(duì)方法的所有調(diào)用。

  • 限制條件
    • 分部方法聲明必須以上下文關(guān)鍵字 partial 開頭,并且方法必須返回 void。
    • 分部方法可以有 ref 參數(shù),但不能有 out 參數(shù)。
    • 分部方法為隱式 private 方法,因此不能為 virtual 方法。
    • 分部方法不能為 extern 方法,因?yàn)橹黧w的存在確定了方法是在定義還是在實(shí)現(xiàn)。
    • 分部方法可以有 static 和 unsafe 修飾符。
    • 分部方法可以為泛型的。約束將放在定義分部方法聲明上,但也可以選擇重復(fù)放在實(shí)現(xiàn)聲明上。參數(shù)和類型參數(shù)名稱在實(shí)現(xiàn)聲明和定義聲明中不必相同。
    • 您可以為已定義并實(shí)現(xiàn)的分部方法生成委托,但不能為已經(jīng)定義但未實(shí)現(xiàn)的分部方法生成委托。
  • 代碼示例
  1. partial void onNameChanged(); 
  2. partial void onNameChanged(){}

 

責(zé)任編輯:陳四芳 來源: M守護(hù)神
相關(guān)推薦

2011-09-16 14:55:07

WLAN干擾無線干擾WLAN

2009-08-13 11:22:59

LINQ和ADO.NE

2010-01-13 11:11:42

VB.NET Date

2013-08-21 16:57:48

.NET反射

2009-11-10 11:04:09

VB.NET數(shù)據(jù)類型

2010-01-18 13:46:32

VB.NET條件分支語

2024-11-04 06:10:00

.NETThreadPool線程池

2009-11-02 14:27:42

Visual Stud

2009-03-11 10:44:49

.netvb.netArray

2009-07-27 15:52:21

ASP.NET特點(diǎn)ASP.NET概述

2009-07-29 13:04:59

2010-01-07 15:42:57

VB.NET WhilEnd While循環(huán)

2009-08-05 13:58:26

ASP.NET Mem

2009-07-22 16:17:39

ASP.NET AJA

2009-07-23 16:55:55

ASP.NET特點(diǎn)

2013-07-30 14:00:46

.NET數(shù)據(jù)類型

2009-07-28 17:17:19

ASP.NET概述

2022-09-29 23:53:06

機(jī)器學(xué)習(xí)遷移學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)

2009-10-15 16:44:47

VB.NET Opti

2009-08-05 17:54:04

ASP.NET運(yùn)行模式
點(diǎn)贊
收藏

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