在C ++中,您可以编写编译代码的多种方法,但是产生了 未定义的行为(Wikipedia). 。 C#中有类似的东西吗?我们可以在C#中编写编译的代码,但行为不确定?

有帮助吗?

解决方案

正如其他人提到的那样,“不安全”块中的几乎所有内容都可以产生实施定义的行为。滥用不安全的块使您可以更改组成运行时本身的代码字节,因此所有下注均已关闭。

整数部门的角案具有实现定义的行为。

抛出例外,从不捕获它会导致实现定义的行为 - 终止过程,启动调试器等。

在C#中还有许多其他情况,我们被迫发出具有实施确定行为的代码。例如,这种情况:

http://blogs.msdn.com/ericlippert/archive/2006/04/06/odious-ambigous-overloads-part-two.aspx

但是,安全,行为良好的C#计划具有实施定义的行为的情况应该非常罕见。

其他提示

是的!即使在安全的背景下! (嗯,它的实现定义为未定义,至少)

这是Marek Safar和Vsadov的 罗斯林问题.C#和CLI之间的不匹配 bool.

C#相信只有一种 true, 和一种 false.

CLI相信这一点 false 是包含0的字节,所有其他值是 true.

这种差异意味着我们可以强迫c#做 一些 一个(边缘)有趣 事物 事物:

//non-standard bool
//We're setting a bool's value to a byte value of 5.
var a = new bool[1];
Buffer.SetByte(a, 0, 5);

//non-standard bool
//We're setting a bool's value to a byte value of 10.
var b = new bool[1];
Buffer.SetByte(b, 0, 10);

//Both are true.
Console.WriteLine(a[0]);
Console.WriteLine(b[0]);

//But they are not the same true.
Console.WriteLine(a[0] == b[0]);

以上输出:

true

true

false

有趣的是,调试器不同意(必须以不同的方式评估真理?)

enter image description here

无论如何,C#团队似乎得出的结论是(强调):

即这种语言将完全不关心非标准的布尔。特定的实现(如CIL上的MS C#中的MS)将确认存在非标准的布尔,并将其行为指定为 不明确的

看着Wiki,不允许使用不确定行为的情况或在C#中抛出异常。

但是,在不安全的代码中,我认为不确定的行为是可能的,因为这使您可以使用指针等。

编辑:看起来我是对的: http://msdn.microsoft.com/en-us/library/aa664771%28vs.71%29.aspx

在C#中有一个不确定行为的示例

根据ECMA-334文件(第473页):

不包含不安全修饰符的任何出现的程序不能表现出任何不确定的行为。

这将“实施定义”促进了最坏的情况,请参见Eric Lippert的答案。

许多和子程序的要求可以总结为:

  1. 给出有效的数据后,产生有效的输出。

  2. 避免发射核导弹或否定时间和因果关系,即使给出了无效的意见。

Java和.NET语言的主要设计目标之一是,除非使用确定为“不安全”的代码,否则通常不需要特别的努力来满足上述第二个约束[尽管某些与垃圾收集和垃圾收集有关的行为 Finalize 从时间/因果关系的角度来看,可能有点怪异,可以将其描述为正常因果关系规则的例外,而不是对它们的总撤销。这种情况与C中的情况有很大不同,在C中,许多类型的数据依赖性错误(例如整数溢出)可能导致编译器以任意方式行事,包括做出任何假设以避免溢出。在“不安全”块之外,在C#或其他.NET语言中不存在真正可怕的不确定行为。

并不是真正的Wiki意义上的,但是我想我想到的最明显的例子只是编写一些螺纹代码,但是在任何语言中都一样。

总的来说,我会拒绝。

在初始化之前使用自动变量。

所有变量必须初始化。如果没有例外。

被零除

抛出了例外。

索引一个界限

抛出了例外

正如Aequitarum Custos指出的那样,您可以使用不安全的代码。再说一次,这并不是真正的C#,您明确选择了C#环境。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top