国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C# > 正文

解析C#面向?qū)ο缶幊讨蟹椒ǎ╩ethod)的使用

2020-01-24 01:18:25
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

方法是包含一系列語(yǔ)句的代碼塊。程序通過(guò)調(diào)用該方法并指定任何所需的方法參數(shù)使語(yǔ)句得以執(zhí)行。在 C# 中,每個(gè)執(zhí)行的指令均在方法的上下文中執(zhí)行。Main 方法是每個(gè) C# 應(yīng)用程序的入口點(diǎn),并在啟動(dòng)程序時(shí)由公共語(yǔ)言運(yùn)行時(shí) (CLR) 調(diào)用。
方法簽名
通過(guò)指定訪問(wèn)級(jí)別(如 public 或 private)、可選修飾符(如 abstract 或 sealed)、返回值、方法的名稱(chēng)以及任何方法參數(shù),在類(lèi)或結(jié)構(gòu)中聲明方法。這些部件一起構(gòu)成方法的簽名。
注意
出于方法重載的目的,方法的返回類(lèi)型不是方法簽名的一部分。但是在確定委托和它所指向的方法之間的兼容性時(shí),它是方法簽名的一部分。
方法參數(shù)在括號(hào)內(nèi),并且用逗號(hào)分隔。空括號(hào)指示方法不需要任何參數(shù)。此類(lèi)包含三種方法:

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(); }

方法訪問(wèn)
調(diào)用對(duì)象上的方法就像訪問(wèn)字段。在對(duì)象名之后添加一個(gè)句點(diǎn)、方法名和括號(hào)。參數(shù)列在括號(hào)里,并且用逗號(hào)分隔。因此,可在以下示例中調(diào)用 Motorcycle 類(lèi)的方法:

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);    }}

方法參數(shù)與參數(shù)
該方法定義指定任何所需參數(shù)的名稱(chēng)和類(lèi)型。調(diào)用代碼調(diào)用該方法時(shí),它為每個(gè)參數(shù)提供了稱(chēng)為參數(shù)的具體值。參數(shù)必須與參數(shù)類(lèi)型兼容,但調(diào)用代碼中使用的參數(shù)名(如果有)不需要與方法中定義的參數(shù)名相同。例如:

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;}

按引用傳遞與按值傳遞
默認(rèn)情況下,值類(lèi)型傳遞給方法時(shí),傳遞的是副本而不是對(duì)象本身。因此,對(duì)參數(shù)的更改不會(huì)影響調(diào)用方法中的原始副本。可以使用 ref 關(guān)鍵字按引用傳遞值類(lèi)型。
引用類(lèi)型的對(duì)象傳遞到方法中時(shí),將傳遞對(duì)對(duì)象的引用。也就是說(shuō),該方法接收的不是對(duì)象本身,而是指示該對(duì)象位置的參數(shù)。如果通過(guò)使用此引用更改對(duì)象的成員,即使是按值傳遞該對(duì)象,此更改也會(huì)反映在調(diào)用方法的參數(shù)中。
通過(guò)使用 class 關(guān)鍵字創(chuàng)建引用類(lèi)型,如以下示例所示。

public class SampleRefType{ public int value;}

現(xiàn)在,如果將基于此類(lèi)型的對(duì)象傳遞到方法,則將傳遞對(duì)對(duì)象的引用。下面的示例將 SampleRefType 類(lèi)型的對(duì)象傳遞到 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;}

該示例執(zhí)行的內(nèi)容實(shí)質(zhì)上與先前示例相同,均按值將參數(shù)傳遞到方法。但是因?yàn)槭褂昧艘妙?lèi)型,結(jié)果有所不同。 ModifyObject 中所做的對(duì)形參 obj 的 value 字段的修改,也會(huì)更改 TestRefType 方法中實(shí)參 rt 的 value 字段。 TestRefType 方法顯示 33 作為輸出。

返回值
方法可以將值返回到調(diào)用方。如果列在方法名之前的返回類(lèi)型不是 void,則該方法可通過(guò)使用 return 關(guān)鍵字返回值。帶 return 關(guān)鍵字,后跟與返回類(lèi)型匹配的值的語(yǔ)句將該值返回到方法調(diào)用方。 return 關(guān)鍵字還會(huì)停止執(zhí)行該方法。如果返回類(lèi)型為 void,沒(méi)有值的 return 語(yǔ)句仍可用于停止執(zhí)行該方法。沒(méi)有 return 關(guān)鍵字,當(dāng)方法到達(dá)代碼塊結(jié)尾時(shí),將停止執(zhí)行。具有非空的返回類(lèi)型的方法都需要使用 return 關(guān)鍵字來(lái)返回值。例如,這兩種方法都使用 return 關(guān)鍵字來(lái)返回整數(shù):

class SimpleMath{ public int AddTwoNumbers(int number1, int number2) {  return number1 + number2; } public int SquareANumber(int number) {  return number * number; }}

若要使用從方法返回的值,調(diào)用方法可以在相同類(lèi)型的值足夠的地方使用該方法調(diào)用本身。也可以將返回值分配給變量。例如,以下兩個(gè)代碼示例實(shí)現(xiàn)了相同的目標(biāo):

(1)

 int result = obj.AddTwoNumbers(1, 2);result = obj.SquareANumber(result);// The result is 9.Console.WriteLine(result);
(2)
result = obj.SquareANumber(obj.AddTwoNumbers(1, 2));// The result is 9.Console.WriteLine(result);

在這種情況下,使用本地變量 result 存儲(chǔ)值是可選的。此步驟可以幫助提高代碼的可讀性,或者如果需要存儲(chǔ)該方法整個(gè)范圍內(nèi)參數(shù)的原始值,則此步驟可能很有必要。

異步方法
通過(guò)使用異步功能,你可以調(diào)用異步方法而無(wú)需使用顯式回調(diào),也不需要跨多個(gè)方法或 lambda 表達(dá)式來(lái)手動(dòng)拆分代碼。Visual Studio 2012 中已引入異步功能。
如果用 async 修飾符標(biāo)記方法,則可以使用該方法中的 await 運(yùn)算符。當(dāng)控件到達(dá)異步方法中的 await 表達(dá)式時(shí),控件將返回到調(diào)用方,并在等待任務(wù)完成前,方法中進(jìn)度將一直處于掛起狀態(tài)。任務(wù)完成后,可以在方法中恢復(fù)執(zhí)行。
注意
異步方法在遇到第一個(gè)尚未完成的 awaited 對(duì)象或到達(dá)異步方法的末尾時(shí)(以先發(fā)生者為準(zhǔn)),將返回到調(diào)用方。
異步方法可以具有 Task<TResult>、Task 或 void 返回類(lèi)型。Void 返回類(lèi)型主要用于定義需要 void 返回類(lèi)型的事件處理程序。無(wú)法等待返回 void 的異步方法,并且返回 void 方法的調(diào)用方無(wú)法捕獲該方法引發(fā)的異常。
在以下示例中,DelayAsync 是具有 Task<TResult> 返回類(lèi)型的異步方法。 DelayAsync 具有返回整數(shù)的 return 語(yǔ)句。因此,DelayAsync 的方法聲明必須具有 Task<int> 的返回類(lèi)型。因?yàn)榉祷仡?lèi)型是 Task<int>,DoSomethingAsync 中 await 表達(dá)式的計(jì)算如以下語(yǔ)句所示得出整數(shù):

int result = await delayTask


startButton_Click 方法是具有 void 返回類(lèi)型的異步方法的示例。因?yàn)?DoSomethingAsync 是異步方法,調(diào)用 DoSomethingAsync 的任務(wù)必須等待,如以下語(yǔ)句所示:await DoSomethingAsync();。 startButton_Click 方法必須使用 async 修飾符進(jìn)行定義,因?yàn)樵摲椒ň哂?await 表達(dá)式。

// 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;}

輸出: 

 

Result: 5

異步方法不能聲明任何 ref 或 out 參數(shù),但是可以調(diào)用具有這類(lèi)參數(shù)的方法。


表達(dá)式主體定義
具有立即僅返回表達(dá)式結(jié)果,或單個(gè)語(yǔ)句作為方法主題的方法定義很常見(jiàn)。以下是使用 => 定義此類(lèi)方法的語(yǔ)法快捷方式:

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 或是異步方法,則該方法的主體必須是語(yǔ)句表達(dá)式(與 lambda 相同)。對(duì)于屬性和索引器,兩者必須是只讀,并且不使用 get 訪問(wèn)器關(guān)鍵字。
迭代器
迭代器對(duì)集合執(zhí)行自定義迭代,如列表或數(shù)組。迭代器使用 yield return 語(yǔ)句返回元素,每次返回一個(gè)。當(dāng) yield return 語(yǔ)句到達(dá)時(shí),將記住當(dāng)前在代碼中的位置。下次調(diào)用迭代器時(shí),將從該位置重新開(kāi)始執(zhí)行。
通過(guò)使用 foreach 語(yǔ)句從客戶端代碼調(diào)用迭代器。
迭代器的返回類(lèi)型可以是 IEnumerable、IEnumerable<T>、IEnumerator 或 IEnumerator<T>。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 军事| 藁城市| 黄骅市| 建宁县| 蒙山县| 盐源县| 阿荣旗| 六盘水市| 绥江县| 宝丰县| 晴隆县| 迁西县| 沧源| 香港 | 获嘉县| 宜昌市| 大新县| 泸溪县| 武穴市| 龙江县| 临猗县| 台东市| 杨浦区| 彰化县| 宣恩县| 莱州市| 灵台县| 安平县| 屯门区| 金坛市| 莱阳市| 湖北省| 永德县| 白玉县| 泗洪县| 扎赉特旗| 江口县| 德钦县| 桓仁| 广昌县| 石屏县|