Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

Default Access Modifier สำหรับ Class Member ใน C#

คำตอบ: 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 แทน