代码之家  ›  专栏  ›  技术社区  ›  Seph

未设置为对象实例的对象引用的获取空引用对象的类型

  •  2
  • Seph  · 技术社区  · 14 年前

    自从我开始编程以来,这个问题一直困扰着我,不是“我的代码在哪里为空”,而是有什么方法可以从异常中获得空的对象类型?

    如果不能做到这一点,是否有人可以提供一篇博客文章或是一篇解释.NET框架不能(或不能)提供这些详细信息的msdn文章?

    1 回复  |  直到 14 年前
        1
  •  4
  •   James Curran    14 年前

    嗯。。。因为它是空的。

    在C中,引用类型是指向某个对象的指针。空指针没有指向任何内容。你在问,“如果它指向某个东西,这会指向什么类型的东西”。这有点像拿一张空白的纸,然后问,“如果上面写着什么,这会说什么?”

    更新:如果框架不知道空指针的类型,它就不能知道应该是什么类型吗?嗯,可能吧。再说一次,可能不会。考虑:

     MyClass myobj = null;
     int hash = myobj.GetHashCode();
    

    除非您在MyClass中覆盖它,否则getHashCode在System.Object中定义。你是否应该收到一个投诉,说myobj必须是一个系统对象?现在,当我们检查自己时,我们可以完全自由地指定所需的类型。

      SomeFunc(MyClass myparam)
      {
           if (myparam == null)
               throw new ArgumentNullException("myparam must be a MyClass object");
      }
    

    但现在我们讨论的是应用程序代码,而不是clr代码。这使你“真正”的问题“为什么人们不写更多的信息异常消息?”,也就是我们在这里所说的“所以” 主观性和争论性

    所以,您基本上希望系统级的异常知道只有在应用程序级才知道的类型信息,我们需要这样的方式来进行通信。类似:

      SomeFunc(MyClass myparam)
      {
           if (myparam == null)
               throw new ArgumentNullException("myparam", typeof(MyClass));
      }
    

    但这并没有给我们带来多少好处,如果你真的想要,你可以自己写:

      public class MyArgumentNullException : ArgumentNullException
      {
          public MyArgumentNullException(string name, Type type) 
              :base(name + "must be a " + type.Name + " object");
      }