口头回答当然是正确的。 仅增加一点:
当I debug和I对变数进行控制时,它显示了信息的类型。
权利。 你们有一 bow。 bow被贴上“FRUIT”。 头巾是空的。 谷物的类型如何? 不能说,因为 bow有 fruit。 但是,这并不意味着你对therkl一无所知。 你们知道,宝石可以含有任何果实。
当你背上variable时,浮标可以告诉你变数本身或内容。
夸张是否使用其他信息,只是某种反映,以发现数据类型?
绝对。 夸张不仅需要知道,而且需要知道这一参考文件中提到的事项类型,而且还需要对可以储存在上的物品施加限制。 关于对特定储存地点实行何种限制的所有信息,都知道时间,操作时间可以告诉变压者。
它比我知道多了吗?
I reject the premise of the question. The debugger is running on your behalf; it cannot do anything that you cannot do yourself. If you don t know what the type restriction on a particular variable is, it s not because you lack the ability to find out. You just haven t looked yet.
如果它知道这一点,那么它为什么无法在“NllReferenceException”中显示数据类型?
想一想一下,当你不予考虑时,实际发生什么。 举例来说,你这样做:
Fruit f = null;
string s = f.ToString();
谷物中可能超载。 哪一部法律必须产生? 让我们相信,地方变量 f储存在一个堆积地点。 垃圾主说:
- copy the contents of the memory address at the stack pointer offset associated with f to register 1
- The virtual function table is going to be, lets say eight bytes from the top of that pointer, and ToString is going to be, let s say, four bytes from the top of that table. (I am just making these numbers up; I don t know what the real offsets are off the top of my head.) So, start by adding eight to the current contents of register 1.
- Now dereference the current contents of register 1 to get the address of the vtable into register 2
- Now add four bytes to register 2
- Now we have a pointer to the ToString method...
但是,在一分钟内,请允许我再次遵循这一逻辑。 第一步将零列入登记册1,因为f 含有零。 第二步增加了8个。 第三个步骤是贴画0x00000008,虚拟记忆系统是一个例外,指出非法的记忆页刚刚被触动。 《刑法》处理这一例外情况,确定这一例外发生在第一个64K记忆中,并相信有人刚刚放弃了一个无效点。 因此,它造成了一个完全的参考性例外。
虚拟记忆系统肯定不明白,它贬低了0x00008点的理由是有人试图打着f.ToString()。 这一信息过去已经消失;记忆管理者的工作是告诉你你你你,你没有权利接触的东西;why。 你们试图与你们相见,并不是说自己的事情。
南极海生委可以维持一个单独的侧面数据结构,这样每当你获得记忆时,它就说明你为什么试图这样做。 这样,该例外就可以得到更多的信息,说明在例外情况发生时你正在做什么。 为every获取记忆提供这种数据结构的费用! 管理守则可能比今天要低十倍,而成本则像按破碎的代码一样通过正确编码承担。 什么? 告诉你你你你可以轻率地 figure出的东西:这种变数含有你不喜欢的错误。
该特征不值得付出代价,因此《刑法》没有这样做。 没有任何技术原因无法做到;它只是不切实际的。