คำตอบ: Private
Default Access Modifier สำหรับ Class Member ใน C# คือ private
หมายความว่า ถ้าไม่ระบุ Access Modifier สมาชิก (Fields, Methods, Properties, Events, Nested Types) จะเป็น Private อัตโนมัติ - เข้าถึงได้เฉพาะภายในคลาสเดียวกันเท่านั้น
ตัวอย่าง
using System;
namespace RectangleApplication {
class Rectangle {
// ไม่ระบุ Modifier -> เป็น private อัตโนมัติ
double length;
double width;
// ต้องเป็น public เพื่อให้ภายนอกเข้าถึงได้
public void AcceptDetails() {
length = 10;
width = 14;
}
public double GetArea() {
return length * width;
}
public void Display() {
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}
class ExecuteRectangle {
static void Main(string[] args) {
Rectangle r = new Rectangle();
r.AcceptDetails(); // OK - public
r.Display(); // OK - public
// r.length = 5; // ❌ Compile Error: 'length' is private
// r.width = 10; // ❌ Compile Error: 'width' is private
Console.ReadLine();
}
}
}
Default Access Modifiers สรุป
| Context | Default Access | หมายเหตุ |
|---|---|---|
| Class Member (Field, Method, Property, Event, Nested Type) | private | เข้าถึงได้เฉพาะในคลาสเดียวกัน |
| Class/Struct (Non-nested) | internal | เข้าถึงได้ใน Assembly เดียวกัน |
| Interface Member | public | ไม่สามารถระบุ Modifier อื่นได้ (C# 8.0+ สามารถ private ได้) |
| Enum Member | public | ไม่สามารถระบุ Modifier ได้ |
| Delegate | internal (Non-nested) / private (Nested) | ขึ้นอยู่กับ Context |
Access Modifiers ทั้งหมดใน C#
| Modifier | เข้าถึงได้จาก |
|---|---|
public |
ทุกที่ (Anywhere) |
internal |
Assembly เดียวกัน |
protected |
คลาสเดียวกัน + Derived Classes |
protected internal |
Assembly เดียวกัน OR Derived Classes |
private protected |
คลาสเดียวกัน + Derived Classes ใน Assembly เดียวกัน |
private |
คลาสเดียวกันเท่านั้น |
Encapsulation และ Private Members
Member Variables (Fields) ควรเป็น private เพื่อ Encapsulation (การห่อหุ้ม) - ควบคุมการเข้าถึงผ่าน Public Methods/Properties แทน
public class BankAccount {
// Private Field - ซ่อนข้อมูลภายใน
private decimal _balance;
// Public Property - ควบคุมการเข้าถึง
public decimal Balance {
get => _balance;
private set {
if (value < 0) throw new ArgumentException("Balance cannot be negative");
_balance = value;
}
}
// Public Method - Business Logic
public void Deposit(decimal amount) {
if (amount <= 0) throw new ArgumentException("Amount must be positive");
Balance += amount;
}
}
Best Practice
- ใช้ private เป็น Default สำหรับ Fields (Encapsulation)
- ใช้ Properties แทน Public Fields
- ระบุ Access Modifier อย่างชัดเจน (Explicit) เพื่อความชัดเจนของโค้ด
- หลีกเลี่ยง
public fields- ใช้ Properties แทน