据此,字符串(或字符串)是一种引用类型。
然而给出:
Type t = typeof(string);
然后
if (t.IsByRef) ...
返回假
为什么?
编辑:经过一些快速测试,我显然误解了 IsByRef 的目的......因为即使使用类名代替 'string' ,也会返回 false 。我正在编写一个泛型类,并想测试当泛型实例化时传入的类型是值类型还是引用类型。如何对此进行测试?
您应该IsValueType
改用:
bool f = !typeof (string).IsValueType; //return true;
至于IsByRef
,这个属性的作用是判断参数是通过 ref 还是通过 value 传入方法。
示例您有一个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
,它对应于typeof(int).MakeReferenceType()
.
请注意,这是两种不同类型的“参考”,彼此完全正交。
(事实上,还有第三种“引用”,System.TypedReference
,就是一个struct
。
还有第四种引用,每个 C 程序员都知道的那种——指针,T*
。)
你想检查它是否是一个值类型。
typeof(object).IsValueType :- false
typeof(int).IsValueType :- true