如果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