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

C# 3.0 var 與擴展方法實戰:命名空間組織與對象擴展最佳實踐

     編輯:關於C語言

var 關鍵字:編譯期類型推斷的佔位符

基本用法與 IL 驗證


// 源碼
var i = 0;
var flag = true;
var name = "Henllyee";

// 編譯後 IL .locals init
// [0] int32 i
// [1] bool flag
// [2] string name

var 本質上不改變類型系統,編譯器根據初始化表達式靜態推斷,生成 IL 與顯式聲明完全一致。

foreach 中的 var


var list = new List { 1, 2, 4, 100 };
foreach (var item in list) 
    Console.Write(item + ", ");
// item 類型為 int,無需手寫

四大硬性限制(違反即編譯錯誤)

  1. 聲明時必須初始化(var x; ❌)
  2. 不可用 null 初始化(var x = null; ❌)
  3. 不能作為方法參數/返回類型
  4. 不能作為類字段/屬性

擴展方法:為 object 添加「查看所在程序集」能力

定義範例


public static class ObjectExtensions
{
    public static string DisplayDefiningAssembly(this object obj)
    {
        var type = obj.GetType();
        var asm = Assembly.GetAssembly(type);
        return $"{type.Name} lives here:\n\t{asm}";
    }
}

三大定義規範

  1. 靜態類 + 靜態方法
  2. 第一參數加 this 指定擴展類型
  3. 只能在實例上調用(或通過靜態類語法調用)

調用示例


var ds = new DataSet();
Console.WriteLine(ds.DisplayDefiningAssembly());
// 輸出類似:
// DataSet lives here:
//      System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

命名空間組織最佳實踐:讓擴展方法「無處不在」

痛點:自定義命名空間的擴展方法需顯式 using,易遺漏。解決方案:將擴展類放入目標類型所在命名空間(如 System),實現「零引入自動可用」。

實戰:為 int 添加 Foo 方法


// HenllyeeExtensions.cs
namespace System // 關鍵:放入 System 命名空間
{
    public static class HenllyeeExtensions
    {
        public static void Foo(this int i, string msg)
            => Console.WriteLine($"{i} called Foo() say '{msg}'");
    }
}

// Program.cs - 無需 using System 即可直接調用
int i = 0;
i.Foo("Hello, Henllyee!"); // 智能提示自動出現
// 輸出:0 called Foo() say 'Hello, Henllyee!'

優缺點權衡

策略優點缺點適用場景
放入 System/BCL 命名空間零 using 自動可用,發現性極強污染核心命名空間,可能衝突,官方不推薦大量使用極通用的基礎擴展(如 ToInt32、IsNullOrEmpty)
專用命名空間 + 全局 using可控、無污染、現代 C# 支持 global using需項目級配置企業級項目、模塊化架構
按需 using意圖明確、無副作用易遺漏、重複引入小項目、臨時腳本

總結

var 讓類型聲明「按需推斷」,擴展方法讓類型能力「按需擴展」。兩者結合,配合合理的命名空間策略,能構建出可發現、可組合、低樣板的現代 C# 代碼風格。核心原則:var 用於明顯可推斷處,擴展方法用於輔助增強,命名空間組織服務於發現性與隔離性的平衡。

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