[英]What's the type of “Method” itself in C#?
我聽說C#是一種純粹的面向對象的編程語言,因為所有東西都是從System.Object
派生的。
所以我懷疑方法本身的類型是什么。 我嘗試使用StackTrace
和StackFrame
來獲取方法類型,但我只獲得了類的名稱,聲明了哪些方法。
當然,我試過這個:
var func = new TestClass().TestMethod; //TestMethod is a method of TestClass
但是我只得到了這個錯誤。
CS0815 Cannot assign method group to an implicitly-typed variable
可以將方法分配給Func<..., TResult>
類型變量。 我用Func和返回字符串的方法測試,然后我得到了這個:
// Result of
// Func<string> func = new TestClass().TestMethod;
// func.GetType();
Instance TestClass -> TestMethod Type : System.Func`1[System.String]
但它是Func<string>
。 那么,方法的真正類型名稱是什么?
編輯2018年2月10日上午01:46,KST(GMT +09:00)
好吧,讓我總結一下。 函數本身沒有類型,也不是對象, Delegate
/ Func<>
是.NET Framework的一個功能, 它將函數作為一等公民處理( 但它不是FCC )。 這是正確的嗎?
方法沒有類型 。 方法就是它們 - 只是對象或類的“可調用函數”。 您可以將它們分配給具有相同簽名的Delegates
或Func
這一事實只是框架的一個特性,但該方法本身沒有任何“類型”。
與類型最接近的可能是方法的返回值(如果有的話)。
方法不是對象,因此它沒有類型。
C#中的方法是將函數附加到類的面向對象的方法,但它們不是一等公民,因為函數在JavaScript中。
這就是為什么你不能為變量分配方法的原因。
你不能這樣做:
var func = Int32.Parse;
但相反,你可以做這樣的事情:
Func<string, int> func2 = Int32.Parse;
在第二個例子中,盡管看起來你實際上是在為一個變量分配方法,但實際情況是編譯器創建了一個新的Func<string, int>
實例,它是一個委托(最終派生自System.Object
)碰巧實際上持有對方法本身的類型安全引用。
該委托是一個對象,可以作為參數分配並傳遞給其他方法,但不是方法本身而是包裝器。
所有東西都是從System.Object派生出來的,但並非一切都是一件事。
“因為System.Object是.NET Framework類型系統中所有類型的基類,所以GetType方法可用於返回表示所有.NET Framework類型的Type對象..NET Framework可識別以下五類類型:
類,派生自System.Object,
值類型,派生自System.ValueType。
接口,從.NET Framework 2.0開始,從System.Object派生。
枚舉,派生自System.Enum。
代理,派生自System.MulticastDelegate。“
實例方法不是其中之一,除了類之外沒有任何意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.