官方的封裝可以列在 存取修飾詞 這篇。
存取修飾詞
存取修飾詞 | 作用 | 存取範圍 |
---|---|---|
public | 公開 | 無限制 |
private(預設) | 私有 | 只有 本身可以存取 |
protected | 保護 | 相同 父類別 or 繼承自父類別的子類別(衍生類別),可參考繼承使用方式 |
internal | 內部 | 限於目前元件 |
protected internal | 存取限於目前元件或衍生自包含類別的類型 | |
private protected | 存取限於包含類別或衍生自目前元件內包含類別的類型 |
Private
class Employee
{
private int i;
double d; // 預設 Private
}
Example:
class Employee2
{
private string name = "FirstName, LastName";
private double salary = 100.0;
public string GetName()
{
return name;
}
public double Salary
{
get { return salary; }
}
}
class PrivateTest
{
static void Main()
{
var e = new Employee2();
// 數據成員不可訪問(私有)
// string n = e.name; // Error
// double s = e.salary; // Error
string n = e.GetName(); // Success
double s = e.Salary; // Success
}
}
Public
class SampleClass
{
public int x; // 沒有訪問限制
}
Example
class PointTest
{
public int x;
public int y;
}
class Program
{
static void Main()
{
var p = new PointTest();
// 直接訪問公共成員。
p.x = 10;
p.y = 15;
Console.WriteLine($"x = {p.x}, y = {p.y}"); // Output: x = 10, y = 15
}
}
// Output: x = 10, y = 15
Protected
class A
{
protected int x = 123;
}
class B : A // 繼承 A
{
static void Main()
{
var a = new A();
var b = new B();
a.x = 10; // Error CS1540, 因為x只能由A or A的繼承所使用,此操作是由 Main 所發出而不是在B的執行個體所以無法使用。
b.x = 10; // Success, 因為繼承至A所以可以使用
}
}
Internal
只能使用於相同的檔案內部使用,不同的檔案則無法使用。常用於以元件為基礎的開發作,因為它可讓一組元件私下相互合作,而不會公開給應用程式的其餘程式碼。
Example
// Assembly1.cs
// Compile with: /target:library
internal class BaseClass
{
public static int intM = 0;
}
// Assembly1_a.cs
// Compile with: /reference:Assembly1.dll
class TestAccess
{
static void Main()
{
var myBase = new BaseClass(); // CS0122
}
}