13

据此,字符串(或字符串)是一种引用类型。

然而给出:

Type t = typeof(string);

然后

if (t.IsByRef) ...    

返回假

为什么?

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

4

3 回答 3

14

您应该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
于 2013-05-16T04:08:51.023 回答
12

有“引用类型”——我们有!type.IsValueType——然后有代表任何东西的引用的类型——无论它们的目标是值类型还是引用类型。

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

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

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

于 2013-05-16T04:11:20.297 回答
5

你想检查它是否是一个值类型

typeof(object).IsValueType :- false
typeof(int).IsValueType :- true
于 2013-05-16T04:05:35.347 回答