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

Effective C# 原則 43:請勿濫用反射 (上)

     編輯:關於C語言

反射的代價

二進位組件意味著晚期繫結與反射。反射雖能動態擴充功能,但繞過 C# 型別安全:參數與回傳值皆為 object,需執行期驗證,極易出錯。

反射三大功能

  • 建立型別實例
  • 呼叫物件成員方法
  • 存取物件資料成員

聽起來像日常編程,實則是動態載入外部組件。多數情況有更易維護的替代方案。

建立實例:工廠函式優於反射


// 反射版:脆弱、執行期才知成敗
object NewInstance(Type t)
{
    ConstructorInfo ci = t.GetConstructor(Type.EmptyTypes);
    return ci?.Invoke(null);
}

// 工廠版:建構函式被移除即編譯錯誤
public MyType NewInstance() => new MyType();

應使用靜態工廠函式,必要時以屬性標記(參見原則 42)。

呼叫方法:介面優於字串比對


// 反射版:參數清單檢查冗長、易錯
public void InvokeMethod(object o, string name)
{
    foreach (MethodInfo m in o.GetType().GetMember(name))
        if (m.GetParameters().Length == 0) m.Invoke(o, null);
}

需檢查參數型別、數量、回傳值,程式碼極其龐大。介面調用簡潔且型別安全。

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