Home [C# 筆記] 方法的宣告、呼叫、存取範圍
Post
Cancel

[C# 筆記] 方法的宣告、呼叫、存取範圍

方法(Method)是「程式的片段敘述區塊」,通常撰寫於類別(Class)之內。

舉例來說:汽車(Car)是個類別,那麼就擁有一些屬性(如:17吋輪胎)和方法(如:渦輪增壓)。

屬性是「靜態」的行為,而方法是「動態」的行為。

方法的宣告

方法(Method)的宣告語法分為二種型態:

  1. 使用void來表示此方法不需要回傳任值。(沒有回傳值)
  2. 透過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 internalprotected+internal權限。存取只限於這個專案或是子類別。 
 存取範圍需滿足protectedinternal所規範的條件。 

存取範圍:嚴格 → 寬鬆
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 建構資訊系統實戰經典教本

This post is licensed under CC BY 4.0 by the author.

[C# 筆記] StringBuilder 類別

[C# 筆記] 參數傳遞 (Call by Value & Call by Reference)