TonyLian 2009-06-04 09:34
浏览 357
已采纳

C# 如何判断一个引用是数组类型?

string[] a;
int[] b;

// 这样可以判断,但是不是我想要的写法,因为is判断不仅限于类型相等,前者是后者的子类也返回true
// 虽然Array不会有子类,但是我希望写法和其他代码统一风格
if (a is Array){ .... // true
if (b is Array){ .... // true

// 我想要类似这样的写法
if (a.GetType() == typeof(Array)){ .... // false
// 但==左边是String[],右边是System.Array,等式不成立

// 我又不能写成
if (a.GetType() == typeof(string[])){ ... // true
// 因为不仅仅是string数组,int数组,其他数组都希望被检查出来
// 用object[]也不行
if (a.GetType() == typeof(object[])){ ... // false

  • 写回答

1条回答 默认 最新

  • rednaxelafx 2009-06-04 12:37
    关注

    要用GetType的方式来做其实不难,因为所有数组都是直接继承System.Array的。

    [code="c#"]using System;

    static class Demo {
    static bool IsArray(this object o) {
    return o is Array;
    }

    static bool IsArray2(this object o) {
        if (null == o) return false;
        return o.GetType().BaseType == typeof(Array);
    }
    
    static void Main(string[] args) {
        Console.WriteLine("args is array: {0}", args.IsArray());
        Console.WriteLine("args is array: {0}", args.IsArray2());
    }
    

    }[/code]
    但这种情况下用is会比用GetType()快一些,所以我觉得没必要麻烦自己去把一个有内建运算符的东西写得那么长。

    P.S. 如果是GetType()之后直接与一个typeof字面量比较的话,有机会比is快,像是:
    [code="c#"]o.GetType() == typeof(string)[/code]
    有机会比
    [code="c#"]o is string[/code]
    要快一些。

    但如果GetType()之后还有附加的操作,或者比较的另一边不是typeof字面量的话,则总是比is慢。能用is的话还是推荐使用is运算符的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能