如果String是引用类型,为什么类型String的Type.IsByRef返回false?

根据这个 ,字符串(或String)是引用类型。

但是给出了:

Type t = typeof(string); 

然后

 if (t.IsByRef) ... 

返回false

为什么?

编辑:经过一些快速测试后,我显然误解了IsByRef的目的……因为即使使用类名代替’string’,也会返回false。 我正在编写一个generics类,并且想要测试当generics实例化时传入的类型是值还是引用类型。 如何测试呢?

您应该使用IsValueType

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

对于IsByRef ,此属性的目的是确定参数是通过ref还是通过值传递给方法。

示例您有一个方法,其中a由ref传递:

 public static void Foo(ref int a) { } 

您可以确定a是否通过引用传递:

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

有“引用类型” – 我们有!type.IsValueType – 然后有类型表示任何事物的 引用 – 无论它们的目标是值类型还是引用类型。

当你说void Foo(ref int x)x被称为“通过引用传递”,因此ByRef
在引擎盖下, x ref int类型的ref int ,它对应于typeof(int).MakeReferenceType()

请注意,这些是两种不同的“参考”,彼此完全正交。

(事实上​​,还有第三种“引用” System.TypedReference ,它只是一个struct
还有第四种类型的引用,每个C程序员都知道的类型 – 指针, T* 。)

您想检查它是否是值类型 。

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