2026-04-21 public 及 private .....等呢? 是歸屬於什麼?
2026-04-21 public 及 private …..等呢? 是歸屬於什麼?
我:
public 及 private …..等呢? 是歸屬於什麼?
GPT:
當你在學習 C# 的面向物件程式設計(OOP)時,存取修飾符(Access Modifiers) 是一個非常重要的概念。public、private 等關鍵字就是存取修飾符,用來控制類別(Classes)、方法(Methods)、屬性(Properties)、欄位(Fields)等成員的可見性和訪問範圍。了解並正確使用存取修飾符,可以幫助你設計出更安全、可維護和高效的程式碼。
目錄
1. 存取修飾符是什麼?
2. C# 中的主要存取修飾符
◦ public
◦ private
◦ protected
◦ internal
◦ protected internal
◦ private protected
3. 存取修飾符的使用範例
4. 如何選擇合適的存取修飾符
5. 小結
存取修飾符是什麼?
存取修飾符(Access Modifiers) 是用來控制類別及其成員(如方法、屬性、欄位等)的可見性和訪問範圍的關鍵字。透過存取修飾符,你可以決定哪些部分的程式碼可以訪問特定的類別或其成員,從而實現資訊隱藏(Information Hiding)和封裝(Encapsulation)。C# 中的主要存取修飾符
C# 提供了多種存取修飾符,每種修飾符定義了不同的訪問範圍。以下是主要的存取修飾符及其說明:
a. public
• 描述:公開的,沒有任何限制。任何其他類別或組件都可以訪問標記為 public 的類別或成員。
• 使用場景:當你希望某個類別或成員能被所有其他程式碼訪問時使用。
範例:
public class Person
{
public string Name; // 公開欄位
public void Speak() // 公開方法
{
Console.WriteLine(“Hello!”);
}
}
b. private
• 描述:私有的,只能在定義它的類別內部訪問。其他類別無法訪問標記為 private 的成員。
• 使用場景:當你希望某個成員只在類別內部使用,並且不允許外部直接訪問或修改時使用。
範例:
public class Person
{
private int age; // 私有欄位public void SetAge(int value)
{
if (value >= 0)
age = value;
}public int GetAge()
{
return age;
}
}
c. protected
• 描述:受保護的,只能在定義它的類別及其派生類別中訪問。
• 使用場景:當你希望某個成員在類別內部及其子類別中可訪問,但不允許其他外部類別訪問時使用。
範例:
public class Animal
{
protected string species;
protected void DisplaySpecies()
{
Console.WriteLine($"Species: {species}");
}
}
public class Dog : Animal
{
public void SetSpecies(string sp)
{
species = sp; // 可訪問
}
public void ShowSpecies()
{
DisplaySpecies(); // 可訪問
}
}
d. internal
• 描述:內部的,只能在同一個組件(Assembly)內部訪問。不同組件之間無法訪問標記為 internal 的成員。
• 使用場景:當你希望某個類別或成員僅在其所在的組件內部使用,不對外部公開時使用。
範例:
internal class Helper
{
internal void Assist()
{
Console.WriteLine(“Assisting…”);
}
}
e. protected internal
• 描述:受保護且內部的,表示該成員可以在同一個組件內部訪問,或在任何派生類別中訪問(無論組件是否相同)。
• 使用場景:當你希望成員在內部組件內部及其派生類別中可訪問時使用。
範例:
public class Vehicle
{
protected internal int speed;
protected internal void SetSpeed(int sp)
{
speed = sp;
}
}
f. private protected (C# 7.2 及以上版本)
• 描述:私有且受保護的,表示該成員只能在定義它的類別內部,或在同一組件中的派生類別中訪問。
• 使用場景:當你希望成員僅在類別內部及其派生類別(且必須在同一組件內部)中可訪問時使用。
範例:
public class BaseClass
{
private protected void DoSomething()
{
Console.WriteLine(“Doing something…”);
}
}
public class DerivedClass : BaseClass
{
public void Execute()
{
DoSomething(); // 可訪問
}
}
- 存取修飾符的使用範例
讓我們通過一個更完整的範例來理解這些存取修飾符的作用:
using System;
public class Car
{
// 公開欄位
public string Make;
// 私有欄位
private string model;
// 受保護欄位
protected int year;
// 內部欄位
internal string VIN;
// 受保護且內部欄位
protected internal string Color;
// 私有且受保護欄位
private protected string EngineType;
// 公開方法
public void StartEngine()
{
Console.WriteLine("Engine started.");
}
// 私有方法
private void SetModel(string m)
{
model = m;
}
// 受保護方法
protected void DisplayYear()
{
Console.WriteLine($"Year: {year}");
}
// 內部方法
internal void SetVIN(string vin)
{
VIN = vin;
}
// 受保護且內部方法
protected internal void Paint(string newColor)
{
Color = newColor;
Console.WriteLine($"Car painted {Color}.");
}
// 私有且受保護方法
private protected void SetEngineType(string type)
{
EngineType = type;
}
}
public class SportsCar : Car
{
public void Customize()
{
// 可以訪問受保護的欄位和方法
year = 2022;
DisplayYear();
// 可以訪問受保護且內部的欄位和方法
Color = "Red";
Paint("Blue");
// 可以訪問私有且受保護的方法(僅在同一組件內)
SetEngineType("V8");
}
}
class Program
{
static void Main(string[] args)
{
Car myCar = new Car();
myCar.Make = “Toyota”; // 可訪問
myCar.StartEngine(); // 可訪問
// 無法訪問私有欄位和方法
// myCar.model = "Corolla"; // 錯誤
// myCar.SetModel("Corolla"); // 錯誤
// 訪問內部欄位和方法(假設在同一組件內)
myCar.VIN = "123456789";
myCar.SetVIN("987654321");
// 訪問受保護且內部的欄位和方法
myCar.Color = "Green";
myCar.Paint("Yellow");
SportsCar mySportsCar = new SportsCar();
mySportsCar.Customize();
}
}
解析:
1. 類別 Car 定義了不同存取修飾符的欄位和方法。
2. 類別 SportsCar 繼承自 Car,並可以訪問 protected、protected internal 及 private protected 成員(假設在同一組件內)。
3. Program 類別 中的 Main 方法創建了 Car 和 SportsCar 的實例,並展示了哪些成員可以被訪問。
輸出:
Engine started.
Year: 2022
Car painted Blue.
如何選擇合適的存取修飾符
選擇適當的存取修飾符有助於實現良好的封裝和資訊隱藏。以下是一些選擇存取修飾符的建議:
• 使用最小必要原則(Principle of Least Privilege):
◦ 盡量將成員的存取範圍限制在最小必要的範圍內。例如,除非需要,否則不要將欄位設為 public。
• 將欄位設為私有,並使用屬性進行訪問:
◦ 通常建議將類別的欄位(Fields)設為 private,並通過 public 或 protected 的屬性(Properties)來提供對這些欄位的控制性訪問。
• 範例: public class Person
• {
• private string name; // 私有欄位
•
• public string Name // 公開屬性
• {
• get { return name; }
• set { name = value; }
• }
• }
•
• 使用 protected 來允許派生類訪問:
◦ 當你希望派生類能夠訪問某些成員,但不希望外部類別訪問時,使用 protected。
• 使用 internal 和 protected internal 來控制組件內部的訪問:
◦ 當你希望某些成員僅在同一組件內部可訪問,或者在同一組件內部及其派生類中可訪問時,使用 internal 或 protected internal。
• 避免不必要的 public 成員:
◦ 除非確實需要,否則避免將成員設為 public,以防止外部程式碼意外修改或依賴這些成員。小結
存取修飾符(Access Modifiers) 是 C# 中用來控制類別及其成員可見性的重要工具。主要的存取修飾符包括:
• public:公開的,無限制訪問。
• private:私有的,僅限於類別內部訪問。
• protected:受保護的,類別內部及其派生類別可訪問。
• internal:內部的,同一組件內部可訪問。
• protected internal:受保護且內部的,同一組件內部及其派生類別可訪問。
• private protected:私有且受保護的,同一組件內部及其派生類別可訪問。
正確使用存取修飾符可以幫助你實現良好的封裝和資訊隱藏,從而提高程式碼的安全性、可維護性和可擴展性。記住,應盡量限制成員的可訪問範圍,僅在需要時提高其可見性。
如果你有更多關於存取修飾符的問題或需要進一步的範例,請隨時告訴我!