C#中具有未定义行为的代码

luv*_*ere 50 c# c++ undefined-behavior

在C++中,有很多方法可以编写编译的代码,但会产生未定义的行为(维基百科).C#中有类似的东西吗?我们可以用编译的C#编写代码,但是有未定义的行为吗?

Eri*_*ert 40

正如其他人所提到的,"不安全"块中的任何内容都可以产生实现定义的行为; 滥用不安全的块允许您更改构成运行时本身的代码字节,因此所有的赌注都是关闭的.

整数除法的极移情况具有实现定义的行为.

抛出异常并且永远不会捕获它会导致实现定义的行为 - 终止进程,启动调试器等等.

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

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

但是,安全,性能良好的C#程序具有实现定义行为的情况应该非常少见.

  • @MikeMB:我是.这是一个微妙的区别,我通常不会在C#的上下文中制作,除非我需要非常精确.事实上,C++规范的作者认为需要制作一个*分类*语言可以在不告诉你的情况下绊倒你的方式,这不是我认为是语言优势的东西. (6认同)
  • @Eric:我认为你提到的角落案例是通常的1/0.我四处搜索,发现它实际上是`int.MinValue/-1`. (5认同)
  • 是否有人知道或可以推测为什么在语言规范中未定义“ int.MinValue / -1”? (2认同)
  • @NickStrupat:参见[Hans Passant的解释](http://stackoverflow.com/a/26594915/18192) (2认同)

Jos*_*rty 33

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

这是一个来自Marek Safar和VSadov的Roslyn问题.在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]);
Run Code Online (Sandbox Code Playgroud)

以上输出:

true

true

false

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

在此输入图像描述

无论如何,C#团队似乎已经得出结论(重点补充):

IE语言将完全不关心非标准bool.特定实现(如在CIL上的MS C#中)将确认非标准bool的存在并将其行为指定为undefined

  • 这实际上让我笑得很开心. (5认同)

Bre*_*len 12

查看Wiki,不允许发生未定义行为的情况或在C#中抛出异常.

但是在不安全的代码中,我认为未定义的行为是可能的,因为它允许您使用指针等.

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

在c#中有一个未定义行为的例子

  • 当你陈述"Wiki"时,你指的是什么Wiki? (6认同)
  • 链接已死,这个答案什么也没说。 (2认同)

Hen*_*man 11

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

不包含任何unsafe修饰符的程序不能表现出任何未定义的行为.

这促使"实施定义"最坏的情况,请参阅Eric Lippert的回答.