【问题标题】:Why does Type.IsByRef for type String return false if String is a reference type?如果 String 是引用类型,为什么 String 类型的 Type.IsByRef 返回 false?
【发布时间】:2013-05-16 12:40:06
【问题描述】:

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

尚未给出:

Type t = typeof(string);

然后

if (t.IsByRef) ...    

返回假

为什么?

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

【问题讨论】:

  • By这个词不仅仅是装饰,它还有意义。 ;)
  • @Mehrdad - 说得好 - 现在我知道了 .IsByRef 的目的!
  • IsByRef 仅由函数的参数定义使用,以确定它是否配置为 ref/out(VB.net 中的 ByRef)。类类型永远不会将 IsByRef 设置为 true。

标签: c# .net


【解决方案1】:

您应该改用IsValueType

bool f = !typeof (string).IsValueType; //return true;

至于IsByRef,这个属性的作用是判断参数是通过ref还是通过值传入method。

例如,您有一个 a 由 ref 传递的方法:

public static void Foo(ref int a)
{
}

您可以判断a是否通过引用传递:

  bool f = typeof (Program).GetMethod("Foo")
                                 .GetParameters()
                                 .First()
                                 .ParameterType
                                 .IsByRef;   //return true

【讨论】:

    【解决方案2】:

    有“引用类型”——我们有!type.IsValueType——然后有一些类型表示对任何东西的引用——它们的目标是否是值类型或引用类型。

    当您说void Foo(ref int x) 时,x 被称为“通过引用”,因此ByRef
    在底层,x 一个ref int 类型的引用,对应于typeof(int).MakeReferenceType()

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

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

    【讨论】:

    • IsByRef 在 VB 背景下也更有意义,其中相同的方法签名将是:Sub Foo(ByRef x as Integer)
    • 感谢所有响应者!就像我说的那样,“对 .IsByRef 的目的明显误解”......并认为我最初使用的是 .IsValueType 但更改为 .IsByRef 因为我想测试“空性”认为 .IsByRef 是.IsValueType 的反面(如果是,那将是 .IsRefType d'oh!)
    【解决方案3】:

    你想检查它是否是value type

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

    【讨论】:

      猜你喜欢
      • 2011-01-10
      • 2016-09-27
      • 2021-02-05
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 2021-11-25
      相关资源
      最近更新 更多