据此,string(或string)是引用类型。
Yet given:
Type t = typeof(string);
然后if (t.IsByRef) ...
返回false
为什么?
编辑:经过一些快速测试,我显然误解了IsByRef的目的…即使使用类名代替'string',也会返回false。我正在编写一个泛型类,并希望测试当泛型实例化时传递的类型是否为值或引用类型。如何检验这个呢?您应该使用IsValueType
:
bool f = !typeof (string).IsValueType; //return true;
对于IsByRef
,该属性的目的是确定参数是通过引用还是通过值传递给方法。
例子你有一个方法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