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

C# 程式結構核心概念:從原始碼到組件的完整圖解

     編輯:關於C語言

五大核心概念架構圖

┌─────────────────────────────────────┐
│           程式 (Program)            │  一或多個原始檔 (.cs)
├─────────────────────────────────────┤
│          命名空間 (Namespace)        │  邏輯分組,防止名稱衝突
├─────────────────────────────────────┤
│            類型 (Type)              │  Class, Struct, Interface, Enum, Delegate
├─────────────────────────────────────┤
│            成員 (Member)            │  Field, Method, Property, Event, Constructor
├─────────────────────────────────────┤
│           組件 (Assembly)           │  .exe / .dll 物理部署單位,含 IL + 中繼資料
└─────────────────────────────────────┘

完整範例程式碼逐行解析

1. 定義類別庫 (acme.cs)

using System;                    // 引用 System 命名空間

namespace Acme.Collections       // 邏輯分組:Acme.Collections
{
    public class Stack           // 公開類別:Stack
    {
        Entry top;               // 私有欄位:頂端節點 (內部類別 Entry)
        
        public void Push(object data)  // 公開方法:推入
        {
            top = new Entry(top, data); // 建立新節點指向舊頂端
        }

        public object Pop()            // 公開方法:彈出
        {
            if (top == null) 
                throw new InvalidOperationException(); // 空堆疊例外
            
            object result = top.data;  // 取出資料
            top = top.next;            // 移動頂端指標
            return result;             // 回傳資料
        }

        // 巢狀類別:節點定義
        class Entry 
        {
            public Entry next;         // 下一個節點
            public object data;        // 儲存資料
            
            public Entry(Entry next, object data) // 建構函式
            {
                this.next = next;
                this.data = data;
            }
        }
    }
}

2. 編譯為類別庫

csc /t:library acme.cs
// 產生 acme.dll (組件)
// /t:library 表示無進入點,產生 .dll
// 組件包含:IL 程式碼 + 中繼資料 (型別定義、成員簽章、版本、公開金鑰等)

3. 參考組件並使用 (test.cs)

using System;
using Acme.Collections;        // 匯入命名空間,簡化型別名稱

class Test
{
    static void Main()         // 進入點
    {
        Stack s = new Stack(); // 完整名稱:Acme.Collections.Stack
        s.Push(1);
        s.Push(10);
        s.Push(100);
        
        Console.WriteLine(s.Pop()); // 100 (LIFO)
        Console.WriteLine(s.Pop()); // 10
        Console.WriteLine(s.Pop()); // 1
    }
}

4. 編譯可執行檔並參考組件

csc /r:acme.dll test.cs
// /r:acme.dll 參考外部組件
// 產生 test.exe
// 執行 test.exe → 輸出 100, 10, 1

關鍵機制深度解析

組件 — 部署與版本的基本單位

  • 物理檔案:.exe (應用程式) 或 .dll (類別庫)
  • 內容:IL 程式碼 + 中繼資料 + 選用資源
  • 自描述:不需標頭檔/匯入庫,中繼資料完整描述公開型別/成員
  • 版本控制:四部分版本號 Major.Minor.Build.Revision,強命名組件含公開金鑰簽章
  • 執行模型:CLR 載入組件 → JIT 編譯 IL 為機器碼 → 執行

命名空間 — 邏輯組織,非物理邊界

  • 以點號分層:System.Collections.Generic
  • 跨檔案、跨組件皆可貢獻同一命名空間
  • using 指令簡化名稱,不影響編譯輸出
  • 別名指令:using MyList = System.Collections.Generic.List<int>;

類型系統分類

分類關鍵字記憶體繼承適用場景
參考型別class堆疊參考 → 堆積物件單一繼承 + 介面複雜物件、需多態、共享參考
實值型別struct堆疊內嵌不可繼承 (隱含 sealed),可實作介面小型資料結構、高效能、不可變
介面interface契約定義多重實作解耦、多型契約
列舉enum整數基礎型別不可繼承具名常數集合
委派delegate方法參考密封類別事件、回呼、函式指標

成員完整分類

  • 常數/欄位:const (編譯期)、readonly (執行期初始化)、static (型別層級)
  • 方法:實例/靜態、虛擬/覆寫/抽象、擴充方法、區部方法
  • 屬性:get/set/init 存取子、自動實作屬性、索引器 this[int i]
  • 事件:event 關鍵字、標準 EventHandler<TEventArgs> 模式
  • 建構函式/終結子:實例/靜態建構函式、~ClassName() (非確定性清理)
  • 運算子/轉換:operator +、implicit/explicit 轉換

多檔案編譯與前向參考

// File1.cs
namespace Demo { public class A { public B Ref; } }

// File2.cs
namespace Demo { public class B { public A Ref; } }

// 編譯:csc File1.cs File2.cs
// C# 編譯器一次處理所有原始檔,相互參考無需前向宣告
// 概念上等同合併成單一大檔案後編譯

實務最佳實踐

  1. 命名空間對應資料夾結構:Src/MyApp/Domain/Entities/User.cs → namespace MyApp.Domain.Entities
  2. 一檔一型別:公開類別/介面各自獨立檔案,檔名與型別名一致
  3. 內部可見性預設:非公開型別預設 internal,成員預設 private
  4. 組件劃分原則:高內聚、低耦合、獨立部署/版本控制
  5. 公開 API 審慎設計:public 型別/成員一旦發布即難變更,優先用 internal

結語

理解「原始碼 → 命名空間/類型/成員 → 組件 → CLR 執行」的完整鏈路,是掌握 C# 工程化開發的基石。無論是設計領域模型、劃分微服務邊界、排查組件載入失敗、或優化啟動效能,這五大核心概念始終貫穿始終。

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