C 教程第五課 方法

2021-06-06 22:59:11 字數 4680 閱讀 7906

本節課向你介紹c#的方法,其目的是:

1.了解方法的結構格式

2.了解靜態和例項方法之間的區別

3.學會例項物件的使用

4.學會如何呼叫例項化的物件

5.學會方法的四種引數型別的使用

6.學會使用"this"引用

以往,對於每個程式來說,所有的工作都在main()方法中實現。這對於功能簡單的程式是合適的,因為僅僅用來學習一些概念。有個更好的方法來組織你的程式,那就是使用方法。方法是很有用的,因為方法可以讓你在不同的單元中分開設計你的邏輯模組。

方法的結構格式如下:

屬性 修飾符 返回值型別 方法名(引數)

我們將在後面的課程中,討論屬性和修飾符。方法的返回值可以是任何一種c#的資料型別,該返回值可以賦給變數,以便在程式的後面部分使用。方法名是唯一,可以被程式呼叫。為使得你的**變得更容易理解和記憶,方法的取名可以同所要進行的操作聯絡起來。你可以傳遞資料給方法,也可以從方法中返回資料。它們由大括號包圍起來。大括號中的語句實現了方法的功能。

1.清單5-1. 乙個簡單的方法: onemethod.cs

using system;

class onemethod is not a valid choice", mychoice);

}// pause to allow the user to see the results

console.write("press any key to continue...");

console.readline();

console.writeline();

} while (mychoice != "q" && mychoice != "q"); // keep going until the user wants to quit

}string getchoice() }

說明 1.清單5-1中的程式類似於第四課中的doloop程式。

區別在於:前一課中的程式列印出選單內容,並在main()方法中接受使用者的輸入,而本課中,該功能用乙個名為getchoice()的方法實現,該方法的返回值型別是個字串型別。在main方法中,在switch語句中用到了該串。方法"getchoice"實現了呼叫時所完成的工作。方法名後面的括號內是空的,因為呼叫getchoice()方法時,不需要傳遞任何資料。

2.在方法塊中,我們首先定義了變數"mychoice"。

雖然它與 main()方法中的"mychoice"變數同名同型別, 但它們是不同的兩個變數,因為區域性變數僅僅在其定義的塊內可見。換句話說, getchoice()方法中的"mychoice" 同main()方法中的"mychoice"變數沒有絲毫聯絡。getchoice()方法列印出乙個選單到控制台,並讀取使用者的輸入。"return" 語句把"mychoice"變數值返回給main()方法中的呼叫者getchoice()。注意: "return"語句返回型別同該方法中定義的返回值型別相同,本例中,該返回值是個字串。

3.在main()方法中,在使用getchoice()之前,例項化了乙個新的"onemethod"物件。

這是因為:我們沒有指明乙個"靜態"修飾符。(注意:main()函式帶有"靜態"修飾符),getchoice()就成為乙個例項的方法。 例項方法和靜態方法的區別是:前者可以建立多個類的例項,每個例項有自己的單獨的getchoice()方法。而一旦方法是靜態的,就不存在方法的例項,你只能呼叫該靜態方法的乙個實現。

所以,正如前面所講的,因為getchoice()並不是靜態的,所以,我們必須例項化乙個新物件來使用它。這是通過定義"onemethod om = new onemethod()"來進行的。在等號的左邊,是物件引用"om",其型別是onemethod。"om"是個物件的引用,這點很重要,"om"並不是物件自身,它是個引用onemethod型別物件的變數。 在等號的右邊,把新建立的onemethod物件賦給引用"om"。 關鍵字"new"是個在堆上建立物件的新例項的c#運算子。此處完成的工作是: 在堆上建立乙個新的onemethod例項,並把它賦給om引用。一旦有了om引用的onemethod物件例項,就可以通過om引用來對例項進行處理。

方法,域和其他類成員可以通過"." (點)運算子進行訪問,標識和操縱。一旦需要呼叫方法getchoice(),就通過om引用,並使用點運算子"om.getchoice()"來進行。 getchoice() 塊中的語句執行完畢之後即返回。為了捕捉到getchoice()的返回值,我們使用了賦值運算子"="。 返回串放到了main()函式的區域性變數 mychoice中,從那裡,程式的其餘部分按照前面課程中介紹的方式正常執行。

2.清單5-2. 方法引數:methodparams.cs

using system;

class address

class methodparams while (mychoice != "q" && mychoice != "q"); // keep going until the user wants to quit

}// show menu and get user's choice

string getchoice()

// make decision

void makedecision(string mychoice) .", addr.name);

break;

case "v":

case "v":

this.viewaddresses("cheryl", "joe", "matt", "robert");

break;

case "q":

case "q":

console.writeline("bye.");

break;

default:

console.writeline(" is not a valid choice", mychoice);}}

// insert an address

void addaddress(ref address addr) , address: added.", addr.name, addr.address);

}// remove an address

void deleteaddress(string name) 's address.", name);

}// change an address

void modifyaddress(out address addr) .", addr.name); // causes error!

addr = new address();

addr.name = "joe";

addr.address = "c# station";

}// show addresses

void viewaddresses(params string names) ", name);}}

} 說明

1.清單5-2是清單5-1的修改,主要是對程式進行了模組化,並新增了更多的實現,以便闡述引數傳遞的用法。

c#可以處理四種型別的引數:out(輸出),ref(引用),params(陣列)和value(值)。為了說明引數的用法,我們用兩個字串域建立位址類。

2.在main()方法中,我們呼叫getchoice()來讀取使用者的輸入,並且把字串放到mychoice變數中。

之後,把mychoice變數作為makedecision()函式的實在引數。在實現makedecision()方法時,注意其形式引數為字串mychoice。需要再次說明的是:這是個新的mychoice變數,不同於呼叫者的實在引數,僅僅是適用於本方法的區域性變數。 因為makedecision()方法的mychoice引數沒有任何其他修飾符,故認為它是"值"參,即實在引數的值被拷貝到棧中,故作為值參的變數是區域性的,任何對區域性變數值的改變並不影響到呼叫者的實在引數的值。換句話說,值參僅僅是來自呼叫者的輸入。

3.makedecision()方法中的switch語句完成如下功能:

在每種情形下,都呼叫相應的方法。這些方法的呼叫不同於main()方法。除了使用"mp" 引用,它們還使用了"this"關鍵字。"this"是對當前物件的引用。由於makedecision()方法不是靜態方法,當前物件已經被例項化,所以可以使用"this"引用來呼叫同一例項中的方法。

4.addaddress()方法用到了"ref"引數,即引用可作為引數來傳遞,即該引用被拷貝到棧中,其引用的物件同呼叫者的實參所引用的物件是同乙個。

這意味著:任何對區域性引用的物件的改變也就是對呼叫者所引用的物件的改變。你可以想象一下,這就相當於輸入/輸出引數。

5.modifyaddress()中有乙個輸出引數。

輸出引數僅僅傳遞給被呼叫函式。一旦呼叫該方法時,在棧中的僅有的乙個引用未被賦值,因為根據賦值的確定性原則,在該變數沒有被賦值之前,就不能使用該變數。modifyaddress()方法的第一行作為注釋,說明了這一點。你可以試著去掉注釋符,編譯一下程式,看看結果如何。一旦該變數被賦了值,在程式返回之後,輸出引數就被拷貝到呼叫者的引數中。所以,在方法返回之前,必須給輸出引數賦值。

小結c# 語言的乙個很有用途的引數型別是陣列引數,它須是一維或多維的陣列。在makedecision()方法中,我們傳遞了用四個逗號隔開的字串引數。引數的個數是變數。在viewaddresses()方法中,使用了foreach迴圈,逐一輸出這些字串。陣列引數僅是一種輸入性質的引數,任何對陣列引數值的改變僅僅影響到區域性的副本值。

概括地講,你現在已經理解了方法的組織結構。你還了解了方法的實現可以採用的四種引數型別及其格式。 一旦你使用例項方法,就必須例項化該物件,靜態方法則不同,後者可以在任何時候被呼叫。另外,你也了解了"this"引用是如何呼叫例項方法的。

新編日語教程 第五課

基礎語法 例1 我是小王。1.甲 乙 是提示助詞,讀作 wa 接在名詞後面提示 主語 是助動詞,相當於中文的 是 也可以說相當於英語的 be動詞 甲 乙 的句型相當於漢語的 甲是乙 例2 我不是日本人。2.甲 乙 這是上面句型的否定句,相當於漢語的 甲不是乙 上面句型中的 的否定形式就是 例3 你是...

VBscript教程 第五課 VBScript常數

vb教程 第五課 vbscript常數 什麼是常數?常數是具有一定含義的名稱,用於代替數字或字串,其值從不改變。vbscript 定義了許多固有常數。詳細資訊,請參閱 vbscript 語言參考。建立常數 您可以使用 const 語句在 vbscript 中建立使用者自定義常數。使用 const 語...

C語言第五課

主要內容 二維陣列 字串陣列 多維陣列 理解 一 二維陣列 有兩個下標的陣列稱為二維陣列 定義 型別修飾符 陣列名 常量表示式1 常量表示式2 第一維的長度 第二維的長度 示例 定義乙個2行3列的二維陣列 int array 2 3 這是乙個標準的二維陣列 二維陣列的元素也稱為雙下標變數 0 1 2...