首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 類型系統深度解析:從類、結構到靜態成員的完整指南

     編輯:關於C語言

C# 是一門強型別、面向對象的語言,其類型系統是編寫健壯代碼的基石。本文系統梳理類、結構、構造函數、this、static 等核心概念,並通過實戰代碼揭示最佳實踐。

類:引用類型的基石

類使用 class 關鍵字定義,封裝字段(狀態)與方法(行為)。字段建議標記為 private,通過屬性暴露受控訪問:

public class Car {
    private int _speed;
    private string _name;

    public int Speed {
        get => _speed;
        set => _speed = value;
    }
    public string Name {
        get => _name;
        set => _name = value;
    }

    // 默認構造函數
    public Car() { }

    // 自定義構造函數
    public Car(string name, int speed) {
        _name = name;
        _speed = speed;
    }

    public void ShowState() => Console.WriteLine($"Car {_name} is going {_speed} MPH");
}

對象創建與 new

引用類型必須用 new 在堆上分配內存:

Car c = new Car("Bruce Wong", 150); // 正確
// Car c; c.Name = "Bruce"; // 編譯錯誤:未初始化

構造函數鏈:消除驗證邏輯重複

當類擁有多個構造函數時,將驗證邏輯集中在「主構造函數」中,其他構造函數用 this 鏈式調用:

public class Car {
    public int Speed { get; set; }
    public string Name { get; set; }

    public Car() : this("", 0) { }
    public Car(int speed) : this("", speed) { }
    public Car(string name) : this(name, 0) { }

    // 主構造函數:集中驗證邏輯
    public Car(string name, int speed) {
        Name = name;
        Speed = speed > 150 ? 150 : speed; // 業務規則:最高時速 150
    }
}

執行順序:調用者 → 主構造函數 → 調用者構造函數體。這極大簡化維護。

this 關鍵字的三大用法

  1. 消除歧義:區分參數與同名字段(this.name = name;)
  2. 構造函數鏈:如上所示
  3. 索引器:賦予類陣列般的訪問語法
public class CarCollection : IEnumerable {
    private ArrayList _cars = new ArrayList();
    public Car this[int index] {
        get => (Car)_cars[index];
        set => _cars.Insert(index, value);
    }
    // ... 實現 IEnumerable
}

靜態成員:類級別的共享狀態

static 成員屬於類而非實例,無需創建對象即可調用:

// Console.WriteLine 是靜態方法
Console.WriteLine("Hello"); // 正確
// new Console().WriteLine("Hello"); // 錯誤

關鍵規則:

  • 靜態成員只能訪問靜態數據/成員
  • 非靜態成員可訪問靜態與實例數據
  • CLR 僅為靜態字段分配一次內存,所有實例共享

靜態構造函數:初始化靜態數據的正確時機

若在實例構造函數初始化靜態字段,每次 new 都會重置。靜態構造函數保證僅執行一次,在首次創建實例或訪問靜態成員前由 CLR 自動調用:

public class AppConfig {
    public static string ConnectionString { get; private set; }

    // 無訪問修飾符、無參數、僅一個
    static AppConfig() {
        ConnectionString = LoadFromConfigFile(); // 複雜初始化邏輯
    }
}

執行順序:靜態構造函數 → 實例構造函數。

靜態類:純工具容器

標記為 static class 後:

  • 不可實例化(無 new)
  • 只能包含靜態成員
  • 隱式 sealed,不可繼承
static class Program {
    static void Main(string[] args) { /* 入口點 */ }
}

結語

掌握類型系統細節,能寫出更安全、可維護、高性能的 C# 代碼。記住:封裝字段、善用構造函數鏈、正確理解靜態與實例的邊界,是進階開發者的必修課。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved