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

时间:2013-05-16 03:39:10

标签: c# .net

根据this,字符串(或字符串)是引用类型。

但是给出了:

Type t = typeof(string);

然后

if (t.IsByRef) ...    

返回false

为什么?

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

3 个答案:

答案 0 :(得分:11)

您应该使用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

答案 1 :(得分:11)

有“引用类型” - 我们有!type.IsValueType - 然后有表示引用的类型任何 - 无论是目标是值类型或引用类型。

当您说void Foo(ref int x)时,x被称为“通过引用传递 ”,因此ByRef。 在幕后,x 类型为ref int引用,与{{1}对应}。

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

(事实上,还有第三种“参考”,typeof(int).MakeReferenceType(),只是System.TypedReference。 还有第四种类型的引用,每个C程序员都知道的类型 - 指针struct。)

答案 2 :(得分:5)

您想检查它是否为value type

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