且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

获取空引用对象的类型,对象引用不设置到对象的实例

更新时间:2022-02-11 08:36:01

嗯......因为它是空。

Um... Because it's null.

在C#中,引用类型是一个指针的东西。空指针不指向任何东西。你问:什么样的事情会这一点上,如果它指向的东西。这有点像得到的一张白纸,并问道:你会这样说,如果它有东西写在上面?

In C#, a reference type is a pointer to something. A null pointer isn't pointing to anything. You are asking, "What type of thing would this point to if it was pointing to something". That's sort of like getting a blank sheet of paper, and asking, "What would this say if it had something written on it?"

更新:如果框架无法知道空指针的类型,不能将它知道什么类型它应该是什么?那么,它可能会。话又说回来,它可能不是。试想一下:

UPDATE: If the framework can't know the type of a null pointer, can't it know what type it's supposed to be? Well, it might. Then again, it might not. Consider:

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

除非你在MyClass的推翻它,GetHash code是System.Object的定义。如果你得到MyObj中需要一个System.Object的投诉?现在,当我们检查自己,我们是完全免费的,指定所需的类型。

Unless you overrode it in MyClass, GetHashCode is defined in System.Object. Should you get a complaint that myobj needs to be a System.Object? Now, when we check ourselves, we're completely free to specify the required type.

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

但现在,我们正在谈论的应用code,不是CLR code。它让你真实的问题:为什么不写的人更多的信息异常消息?,这是因为我们在这里说,在如此的的主观和争论

所以,你基本上要在制度层面例外知道哪只知道在应用层面,我们就需要这样的沟通方式类型的信息。是这样的:

So, you basically want the system level exception to know the type information which is only known at the applications level, which we'd need so way to communicate. Something like:

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

但是,这并不是真正购买我们很多,如果你真的想要的话,你可以自己写的:

But that's not really buying us much, and if you really want it, you could write it yourself:

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