方法(Method)是「程式的片段敘述區塊」,通常撰寫於類別(Class)之內。
舉例來說:汽車(Car)是個類別,那麼就擁有一些屬性(如:17吋輪胎)和方法(如:渦輪增壓)。
屬性是「靜態」的行為,而方法是「動態」的行為。
方法的宣告
方法(Method)的宣告語法分為二種型態:
- 使用
void來表示此方法不需要回傳任值。(沒有回傳值) - 透過
return來回傳方法所宣告的資料型別值。(有回傳值)
無回傳值
1
[存取修飾詞] [static] void 方法名稱([資料型別 變數名稱, ...]) { }
範例
1
2
3
4
private void Method1() { }
void Method2() { }
public static void Method3() { }
protected static void Method4(int num, string msg) { }
有回傳值
1
2
3
[存取修飾詞] [static] 資料型別 方法名稱([資料型別 變數名稱, ...]) {
return 資料型別值; //與方法的資料型別一致
}
範例
1
2
3
4
5
6
7
8
9
int Test() { return 10; }
private int AddMethod(int x, int y) {
return x + y;
}
public static string ShowMessage() {
return "Error";
}
方法的呼叫
方法的呼叫可以分為:
1
2
3
4
5
方法的呼叫
- 同類別(Class)內的呼叫
- 不同類別(Class)內的呼叫
- 動態方法的呼叫
- 靜態方法的呼叫 (加上 static,不需要透過 new 來對類別實體化 就可以直接呼叫使用。)
範例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
internal class Program
{
static void Main(string[] args)
{
//同一類別方法呼叫
int result = Add(2, 8); //直接呼叫
//不同類別: 靜態方法呼叫
result = Test.Sum(2, 3); //不用new類別,直接呼叫
//不同類別: 動態方法呼叫
Test test = new Test(); //要new來實體化類別
string s = test.ShowMessage();
}
//同一類別方法呼叫
static int Add(int x, int y) {
return x + y;
}
}
// 不同類別
class Test
{
//靜態方法
public static int Sum(int x, int y) {
return x + y;
}
//動態方法
public string ShowMessage() {
return "執行完畢!";
}
}
方法存取範圍
用「存取修飾詞」來限定方法有效的使用範圍。
| 存取範圍 | 說明 | |
|---|---|---|
private | 私有。只有在同一個類別(Class)下才能存取它,是最嚴格的存取範圍條件。 | |
public | 公開。存取範圍不受任何限制,是最寬鬆的存取範圍條件。 | |
protected | 受保護的。(可透過「繼承關係」存取)。 | |
存取範圍限於該宣告所屬類別,若其他類別想要使用protected所宣告的變數或方法,必須是該類別的「衍生類別」才可。 | ||
internal | 當前專案中,只有同一個namespace的才能存取。 | |
| 存取範圍受限於目前程式碼所屬的組件(dll)內。 | ||
protected internal | protected+internal權限。存取只限於這個專案或是子類別。 | |
存取範圍需滿足protected和internal所規範的條件。 |
存取範圍:嚴格 → 寬鬆
private > internal > protected > protected internal > public
子類(
public)的權限不可以高於父類(internal)的權限。(因為有可能會暴露父類的成員)。
承上,怎麼排除問題?把子類改成跟父類一樣internal就可以了。只要是「繼承關係」,不管兩者是否在同一程序集中,子類都有訪問父類的權限
(跨專案,可透過「繼承關係」,訪問到父類的protected成員)
範例
1
2
3
4
5
6
// Human 就是基底類別、父類別、超類別
// (base class/ parent class/ super class)
public class Human { }
// Man 繼承了 Human
public class Man : Human { }
可以透過「繼承關係」存取到「「protected(受保護的)」的成員。如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//父類
class Human
{
//受保護的方法
protected void Test() { }
}
//子類
class Man : Human //繼承父類Human
{
void Method()
{
//透過「繼承關係」,子類別可以呼叫父類別的「protected(受保護的)成員」
this.Test();
}
}
internal、protected 誰的權限大?
在同一個專案裡,internal 的權限比 protected 大。
因為 internal(當前專案中) 它在當前專案中哪都可以訪問,protected只能被繼承他的子類訪問。
在不同的專案裡,protected 權限大 (因為可以透過「繼承關係」訪問到)。
internal (當前專案中) 它在當前專案中哪都可以訪問,但是,它出了這個專案就訪問不到 internal 的成員。
protected (受保護的) 雖然只能在當前的類別的內部和繼承它的子類中訪問的到,
但是我們出了這專案,在另一個專案裡面,internal 這個成員絕對是訪問不到,
但是我們卻可以通過「繼承關係」訪問到 protected(受保護的)的成員,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//父類
class Human
{
//受保護的方法
protected void Test() { }
}
//子類
class Man : Human //繼承父類Human
{
void Method()
{
//透過「繼承關係」,子類別可以呼叫父類別的「protected(受保護的)成員」
this.Test();
}
}
[C# 筆記] C#中的訪問修飾符(存取修飾詞) by R
[C# 筆記] 訪問修飾符(存取修飾詞)-複習 by R
Book: Visual C# 2005 建構資訊系統實戰經典教本