2013-05-16 115 views
11

根據this,字符串(或字符串)是一個引用類型。如果String是引用類型,爲什麼類型String的Type.IsByRef返回false?

然而考慮到:

Type t = typeof(string); 

然後

if (t.IsByRef) ...  

返回false

爲什麼呢?

編輯:經過一些快速測試,我顯然誤解了IsByRef的目的...... 甚至使用類名替換'string',也返回false。我正在寫一個泛型類,並且想要測試泛型實例化時傳入的類型是值還是引用類型。如何測試這個?

+1

單詞**'by ** **不只是裝飾,它有一個意思。 ;) – Mehrdad

+0

@Mehrdad - 說得好 - 現在我知道了目的.IsByRef! – PMBottas

回答

9

您應該使用IsValueType代替:

bool f = !typeof (string).IsValueType; //return true; 

至於IsByRef,這個屬性的目的是確定的參數是否受到裁判或按值傳遞到方法。

例如,你有哪些a由裁判通過一個方法:

public static void Foo(ref int a) 
{ 
} 

你可以決定是否a是通過引用傳遞與否:

bool f = typeof (Program).GetMethod("Foo") 
           .GetParameters() 
           .First() 
           .ParameterType 
           .IsByRef; //return true 
+0

啊! Marblehead上的光芒閃現!謝謝! – PMBottas

5

你想檢查它是否是value type

typeof(object).IsValueType :- false 
typeof(int).IsValueType :- true 
+0

@Habib很好發現! –

9

有「引用類型」 - 我們有!type.IsValueType - 然後有代表參考任何東西 - 是否他們的目標是值類型或引用類型。

當你說void Foo(ref int x),則x被說成是「按引用傳遞」,因此ByRef
引擎蓋下,x是類型ref int,這將對應於typeof(int).MakeReferenceType()一個參考

請注意,這些是兩種不同的「參考」,彼此完全正交。

(事實上,還有第三種類型的「參考」,System.TypedReference,這僅僅是一個struct
還有第四個類型的引用,每一個C程序員都知道的那種 - 。指針,T*

+3

IsByRef也使VB背景更具意義,其中相同的方法簽名是:Sub Foo(ByRef x as Integer) – Jimmy

+0

感謝所有響應者!就像我說的,「對.IsByRef的目的有一個明顯的誤解」......並且認爲我最初使用的是.IsValueType,但是改爲.IsByRef,因爲我想測試'null-ness'的想法,即.IsByRef是.IsValueType的反面(如果是的話,它會是.IsRefType d'oh!) – PMBottas

相關問題