C 方法 函式

2021-08-22 07:37:42 字數 4608 閱讀 2249

本節課向你介紹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的修改,主要是對程式進行了模組化,並新增了更多的實現,以便闡述引數傳遞的用法。

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"引用是如何呼叫例項方法的。

c 方法(函式)

語法 public 訪問修飾符,公開的,那都可以訪問 static 靜態的 返回值型別 如果不需要返回值,寫viod 方法名 每個單詞字母大寫 引數列表 可省略,注意引數前邊也必須要帶上引數的型別。public static 返回值型別 方法名 引數列表 如 1 求最大值 class hello p...

C 方法 函式

本節課向你介紹c 的方法,其目的是 1.了解方法的結構格式 2.了解靜態和例項方法之間的區別 3.學會例項物件的使用 4.學會如何呼叫例項化的物件 5.學會方法的四種引數型別的使用 6.學會使用 this 引用 以往,對於每個程式來說,所有的工作都在main 方法中實現。這對於功能簡單的程式是合適的...

C 十六 方法 函式

概念 定義方法 語法格式 parameter list 訪問修飾符 返回型別 方法名稱 引數列表 access specifier 訪問修飾符 這個決定了變數或方法對於另乙個類的可見性。return type 返回型別 乙個方法可以返回乙個值。返回型別是方法返回的值的資料型別。如果方法不返回任何值,...