Avatar ·

Modificadores de acesso em C#: public, private, protected, internal — qual a diferença e quando usar cada um?

Olá a todos! Acabei de começar a estudar C# e estou escrevendo minhas primeiras classes. Tropecei nos modificadores de acesso. Até entendo que `public` é "para todos", `private` é "apenas dentro da classe", e `protected` é "para herdeiros". Mas na prática fico confuso. Aqui está um exemplo. Tenho uma classe `BankAccount`:
class BankAccount
{
    public string AccountNumber { get; set; }
    private decimal balance = 0;
    protected decimal interestRate = 0.05m;

    public void Deposit(decimal amount)
    {
        balance += amount;
    }
}
Depois crio uma classe `SavingsAccount` que herda de `BankAccount`:
class SavingsAccount : BankAccount
{
    public void ApplyInterest()
    {
        // Aqui está o problema: posso usar interestRate (protected),
        // mas não posso usar balance (private).
        // Isso é compreensível. Mas o que fazer se quiser dar acesso a balance
        // apenas para herdeiros, mas não para todos os outros?