CLR:如果一个构造失败将它总是扔一个例外吗?
-
20-08-2019 - |
题
在德尔斐,如果有一个例外在施工期间的一个对象:任何分配的存储将发布和异常会被抛出。例如,以下是 保证 要么返回一个有效的 Camera
对象,或者投掷一个例外:
Camera c = new Camera();
你的 从来没有 已经检查所得到的变量空:
Camera c = new Camera();
if (c == null)
throw new Exception("Error constructing Camera") //waste of time
是同一个真正的CLR?
和是否还有其他syntatical constucts返回值是保证要么是有效的,或扔一个例外吗?
- 建立结构(例如矩形的)?
- 得到一个会员枚举的?
- 结果的对象。ToString()?
- mathmatical行动?
在这种情况下执行的数学:
Int32 aspect = 1650.0 / 1080.0;
if (aspect == null)
throw new Exception("Division of two numbers returned null")
解决方案
一个构造中。净是保证返回一个非空类型实例的对象。是否实例 有效的 取决于个人的语义的类型。
例外扔的一个构造将不得随意吞噬CLR(虽然用户代码可以吞咽)。CLR将传播的一个例外,就像例外抛在任何其他方法与对象将最终以适当的垃圾收集。
至于其他情况下,你提到的
- 创造的结构:结构定义永远不能是空。例外情况扔在构造将传播正常
- 得到的成员枚举:枚举strutures/价值类型的发动机罩下,也永远不会是空
- 结果的对象。ToString():这可以(而且可悲的是会)以空。串是一个参照类型和它是完全合法返回null从ToString复盖(请不要).
- 数学运算:这在很大程度上取决于这两个溢出设置的项目和特别是正在使用的类型(与组成浮点)。
数学问题几乎应该得到一个答案。在一方面的结果的数学操作上的原始种类型不会永远是空的。但是,它仍然可以是无效的。例如,以下代码不会扔但是无论是否结果是否有效取决于非常特定的情景
float f1 = 1.0;
float f2 = f1 / 0;
在这一点上f2是一个非常具体的浮动价值,这并不表示实际数量。它是否有效?取决于你的使用情况。
其他提示
是的。我想把它放这种方式(如 失败 可能意味着 逻辑故障 太):如果一个构造不能扔一个例外,返回值保证是非null
所以你从来没有执行这样的检查。
建立结构(例如矩形):一个 struct
不可能是 null
在所有(Nullable
类型被认为是完全不同的类型,即 typeof(int?) != typeof(int)
).叫一个构造为一个结构将无法通过投掷的一个例外或返回的一个实例。
得到的成员枚举:一个 enum
是的只是一个设定的常数。没有什么比"得到一个部件在运行时间。" 它取代在编译时间。
结果的 Object.ToString()
:喜欢的任何方法,可以返回的任何有效的价值 string
类型,其中包括 null
还可以扔的一个例外(在这种情况下,它不返回价值在所有)。
数学运算:所有的表情会返回一个值或投掷的一个例外。返回值可以是任何有效的价值对于这类型(例如 Int32
永远不可能 null
).