<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 方法(C# 編程指南) 方法是包含一系列語句的代碼塊。程序通過調用該方法并指定任何所需的方法參數使語句得以執行。在 C# 中,每個執行的指令均在方法的上下文中執行。Main 方法是每個 C# 應用程序的入口點,并在啟動程序時由公共語言運行時 (CLR) 調用。 | ![](https://box.kancloud.cn/2016-01-31_56adb62c1380a.jpg) 注意 | | :-- | | 本主題討論命名的方法。有關匿名函數的信息,請參閱[匿名函數(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/bb882516.aspx)。 | ## 方法簽名 通過指定訪問級別(如 **public** 或 **private**)、可選修飾符(如 **abstract** 或 **sealed**)、返回值、方法的名稱以及任何方法參數,在[類](https://msdn.microsoft.com/zh-CN/library/0b0thckt.aspx)或[結構](https://msdn.microsoft.com/zh-CN/library/ah19swz4.aspx)中聲明方法。這些部件一起構成方法的簽名。 | ![](https://box.kancloud.cn/2016-01-31_56adb62c1380a.jpg) 注意 | | :-- | | 出于方法重載的目的,方法的返回類型不是方法簽名的一部分。但是在確定委托和它所指向的方法之間的兼容性時,它是方法簽名的一部分。 | 方法參數在括號內,并且用逗號分隔。空括號指示方法不需要任何參數。此類包含三種方法: ``` abstract class Motorcycle { // Anyone can call this. public void StartEngine() {/* Method statements here */ } // Only derived classes can call this. protected void AddGas(int gallons) { /* Method statements here */ } // Derived classes can override the base class implementation. public virtual int Drive(int miles, int speed) { /* Method statements here */ return 1; } // Derived classes must implement this. public abstract double GetTopSpeed(); } ``` ## 方法訪問 調用對象上的方法就像訪問字段。在對象名之后添加一個句點、方法名和括號。參數列在括號里,并且用逗號分隔。因此,可在以下示例中調用 Motorcycle 類的方法: ``` class TestMotorcycle : Motorcycle { public override double GetTopSpeed() { return 108.4; } static void Main() { TestMotorcycle moto = new TestMotorcycle(); moto.StartEngine(); moto.AddGas(15); moto.Drive(5, 20); double speed = moto.GetTopSpeed(); Console.WriteLine("My top speed is {0}", speed); } } ``` ## 方法參數與參數 該方法定義指定任何所需參數的名稱和類型。調用代碼調用該方法時,它為每個參數提供了稱為參數的具體值。參數必須與參數類型兼容,但調用代碼中使用的參數名(如果有)不需要與方法中定義的參數名相同。例如: ``` public void Caller() { int numA = 4; // Call with an int variable. int productA = Square(numA); int numB = 32; // Call with another int variable. int productB = Square(numB); // Call with an integer literal. int productC = Square(12); // Call with an expression that evaulates to int. productC = Square(productA * 3); } int Square(int i) { // Store input argument in a local variable. int input = i; return input * input; } ``` ## 按引用傳遞與按值傳遞 默認情況下,值類型傳遞給方法時,傳遞的是副本而不是對象本身。因此,對參數的更改不會影響調用方法中的原始副本。可以使用 ref 關鍵字按引用傳遞值類型。有關詳細信息,請參閱[傳遞值類型參數(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/9t0za5es.aspx)。有關內置值類型的列表,請參閱[值類型表(C# 參考)](https://msdn.microsoft.com/zh-CN/library/bfft1t3c.aspx)。 引用類型的對象傳遞到方法中時,將傳遞對對象的引用。也就是說,該方法接收的不是對象本身,而是指示該對象位置的參數。如果通過使用此引用更改對象的成員,即使是按值傳遞該對象,此更改也會反映在調用方法的參數中。 通過使用 **class** 關鍵字創建引用類型,如以下示例所示。 ``` public class SampleRefType { public int value; } ``` 現在,如果將基于此類型的對象傳遞到方法,則將傳遞對對象的引用。下面的示例將 SampleRefType 類型的對象傳遞到 ModifyObject 方法。 ``` public static void TestRefType() { SampleRefType rt = new SampleRefType(); rt.value = 44; ModifyObject(rt); Console.WriteLine(rt.value); } static void ModifyObject(SampleRefType obj) { obj.value = 33; } ``` 該示例執行的內容實質上與先前示例相同,均按值將參數傳遞到方法。但是因為使用了引用類型,結果有所不同。 ModifyObject 中所做的對形參 obj 的 value 字段的修改,也會更改 TestRefType 方法中實參 rt 的 value 字段。 TestRefType 方法顯示 33 作為輸出。 有關如何按引用和按值傳遞引用類型的詳細信息,請參閱[傳遞引用類型參數(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/s6938f28.aspx)和[引用類型(C# 參考)](https://msdn.microsoft.com/zh-CN/library/490f96s2.aspx)。 ## 返回值 方法可以將值返回到調用方。如果列在方法名之前的返回類型不是 **void**,則該方法可通過使用 **return** 關鍵字返回值。帶 **return** 關鍵字,后跟與返回類型匹配的值的語句將該值返回到方法調用方。 **return** 關鍵字還會停止執行該方法。如果返回類型為 **void**,沒有值的 **return** 語句仍可用于停止執行該方法。沒有 **return** 關鍵字,當方法到達代碼塊結尾時,將停止執行。具有非空的返回類型的方法都需要使用 **return** 關鍵字來返回值。例如,這兩種方法都使用 **return** 關鍵字來返回整數: ``` class SimpleMath { public int AddTwoNumbers(int number1, int number2) { return number1 + number2; } public int SquareANumber(int number) { return number * number; } } ``` 若要使用從方法返回的值,調用方法可以在相同類型的值足夠的地方使用該方法調用本身。也可以將返回值分配給變量。例如,以下兩個代碼示例實現了相同的目標: ``` int result = obj.AddTwoNumbers(1, 2); result = obj.SquareANumber(result); // The result is 9. Console.WriteLine(result); ``` ``` result = obj.SquareANumber(obj.AddTwoNumbers(1, 2)); // The result is 9. Console.WriteLine(result); ``` 在這種情況下,使用本地變量 result 存儲值是可選的。此步驟可以幫助提高代碼的可讀性,或者如果需要存儲該方法整個范圍內參數的原始值,則此步驟可能很有必要。 有關詳細信息,請參閱[return(C# 參考)](https://msdn.microsoft.com/zh-CN/library/1h3swy84.aspx)。 ## 異步方法 通過使用異步功能,你可以調用異步方法而無需使用顯式回調,也不需要跨多個方法或 lambda 表達式來手動拆分代碼。Visual Studio 2012 中已引入異步功能。 如果用 [async](https://msdn.microsoft.com/zh-CN/library/hh156513.aspx) 修飾符標記方法,則可以使用該方法中的 [await](https://msdn.microsoft.com/zh-CN/library/hh156528.aspx) 運算符。當控件到達異步方法中的 await 表達式時,控件將返回到調用方,并在等待任務完成前,方法中進度將一直處于掛起狀態。任務完成后,可以在方法中恢復執行。 | ![](https://box.kancloud.cn/2016-01-31_56adb62c1380a.jpg) 注意 | | :-- | | 異步方法在遇到第一個尚未完成的 awaited 對象或到達異步方法的末尾時(以先發生者為準),將返回到調用方。 | 異步方法可以具有 [Task&lt;TResult&gt;](https://msdn.microsoft.com/zh-CN/library/dd321424.aspx)、[Task](https://msdn.microsoft.com/zh-CN/library/system.threading.tasks.task.aspx) 或 void 返回類型。Void 返回類型主要用于定義需要 void 返回類型的事件處理程序。無法等待返回 void 的異步方法,并且返回 void 方法的調用方無法捕獲該方法引發的異常。 在以下示例中,DelayAsync 是具有 [Task&lt;TResult&gt;](https://msdn.microsoft.com/zh-CN/library/dd321424.aspx) 返回類型的異步方法。 DelayAsync 具有返回整數的 **return** 語句。因此,DelayAsync 的方法聲明必須具有 **Task&lt;int&gt;** 的返回類型。因為返回類型是 **Task&lt;int&gt;**,DoSomethingAsync 中 **await** 表達式的計算如以下語句所示得出整數:int result = await delayTask。 startButton_Click 方法是具有 void 返回類型的異步方法的示例。因為 DoSomethingAsync 是異步方法,調用 DoSomethingAsync 的任務必須等待,如以下語句所示:await DoSomethingAsync();。 startButton_Click 方法必須使用 **async** 修飾符進行定義,因為該方法具有 **await** 表達式。 ``` // using System.Diagnostics; // using System.Threading.Tasks; // This Click event is marked with the async modifier. private async void startButton_Click(object sender, RoutedEventArgs e) { await DoSomethingAsync(); } private async Task DoSomethingAsync() { Task<int> delayTask = DelayAsync(); int result = await delayTask; // The previous two statements may be combined into // the following statement. //int result = await DelayAsync(); Debug.WriteLine("Result: " + result); } private async Task<int> DelayAsync() { await Task.Delay(100); return 5; } // Output: // Result: 5 ``` 異步方法不能聲明任何 [ref](https://msdn.microsoft.com/zh-CN/library/14akc2c7.aspx) 或 [out](https://msdn.microsoft.com/zh-CN/library/t3c3bfhx.aspx) 參數,但是可以調用具有這類參數的方法。 有關異步方法的詳細信息,請參閱[使用 Async 和 Await 的異步編程(C# 和 Visual Basic)](https://msdn.microsoft.com/zh-CN/library/hh191443.aspx)、[異步程序中的控制流(C# 和 Visual Basic)](https://msdn.microsoft.com/zh-CN/library/hh873191.aspx)和[異步返回類型(C# 和 Visual Basic)](https://msdn.microsoft.com/zh-CN/library/hh524395.aspx)。 ## 表達式主體定義 具有立即僅返回表達式結果,或單個語句作為方法主題的方法定義很常見。以下是使用 **=&gt;** 定義此類方法的語法快捷方式: ``` public Point Move(int dx, int dy) => new Point(x + dx, y + dy); public void Print() => Console.WriteLine(First + " " + Last); // Works with operators, properties, and indexers too. public static Complex operator +(Complex a, Complex b) => a.Add(b); public string Name => First + " " + Last; public Customer this[long id] => store.LookupCustomer(id); ``` 如果該方法返回 **void** 或是異步方法,則該方法的主體必須是語句表達式(與 lambda 相同)。對于屬性和索引器,兩者必須是只讀,并且不使用 **get** 訪問器關鍵字。 ## 迭代器 迭代器對集合執行自定義迭代,如列表或數組。迭代器使用 [yield return](https://msdn.microsoft.com/zh-CN/library/9k7k7cf0.aspx) 語句返回元素,每次返回一個。當 [yield return](https://msdn.microsoft.com/zh-CN/library/9k7k7cf0.aspx) 語句到達時,將記住當前在代碼中的位置。下次調用迭代器時,將從該位置重新開始執行。 通過使用 [foreach](https://msdn.microsoft.com/zh-CN/library/ttw7t8t6.aspx) 語句從客戶端代碼調用迭代器。 迭代器的返回類型可以是 [IEnumerable](https://msdn.microsoft.com/zh-CN/library/system.collections.ienumerable.aspx)、[IEnumerable&lt;T&gt;](https://msdn.microsoft.com/zh-CN/library/9eekhta0.aspx)、[IEnumerator](https://msdn.microsoft.com/zh-CN/library/system.collections.ienumerator.aspx) 或 [IEnumerator&lt;T&gt;](https://msdn.microsoft.com/zh-CN/library/78dfe2yb.aspx)。 有關詳細信息,請參閱[迭代器(C# 和 Visual Basic)](https://msdn.microsoft.com/zh-CN/library/dscyy5s0.aspx)。 ## C# 語言規范 有關詳細信息,請參閱 [C# 語言規范](https://msdn.microsoft.com/zh-CN/library/ms228593.aspx)。該語言規范是 C# 語法和用法的權威資料。 ## 請參閱 [C# 編程指南](https://msdn.microsoft.com/zh-CN/library/67ef8sbd.aspx) [類和結構(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173109.aspx) [訪問修飾符(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173121.aspx) [靜態類和靜態類成員(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/79b3xss3.aspx) [繼承(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173149.aspx) [抽象類、密封類及類成員(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173150.aspx) [params(C# 參考)](https://msdn.microsoft.com/zh-CN/library/w5zay9db.aspx) [return(C# 參考)](https://msdn.microsoft.com/zh-CN/library/1h3swy84.aspx) [out(C# 參考)](https://msdn.microsoft.com/zh-CN/library/t3c3bfhx.aspx) [ref(C# 參考)](https://msdn.microsoft.com/zh-CN/library/14akc2c7.aspx) [傳遞參數(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/0f66670z.aspx)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看