문제

C ++에는 컴파일하는 코드를 작성할 수있는 방법이 많이 있지만 수율 정의되지 않은 행동 (Wikipedia). C#에 비슷한 것이 있습니까? C#에 코드를 작성할 수 있지만 정의되지 않은 동작이 있습니까?

도움이 되었습니까?

해결책

다른 사람들이 언급했듯이, "안전하지 않은"블록의 거의 모든 것이 구현 정의 된 행동을 산출 할 수 있습니다. 안전하지 않은 블록의 남용을 사용하면 런타임 자체를 구성하는 코드 바이트를 변경할 수 있으므로 모든 베팅이 꺼져 있습니다.

정수 부서의 코너 케이스에는 구현 정의 된 동작이 있습니다.

예외를 던지고 그것을 잡지 않으면 구현 정의 된 동작이 발생합니다. 프로세스를 종료하고 디버거를 시작하는 등.

C#에는 구현이 결정된 동작을 가진 코드를 방출 해야하는 다른 여러 상황이 있습니다. 예를 들어,이 상황 :

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

그러나 안전하고 잘 행동하는 C# 프로그램이 구현 정의 된 행동을 갖는 상황은 매우 드물어야합니다.

다른 팁

예! 안전한 맥락에도 있습니다! (글쎄, 그것은 적어도 정의되지 않은 것으로 정의 된 구현입니다)

다음은 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]);

위의 출력 :

true

true

false

흥미롭게도, 디버거는 동의하지 않습니다 (진실을 다르게 평가해야합니까?)

enter image description here

어쨌든 C# 팀이 온 것으로 보이는 결론은 다음과 같습니다 (강조 추가).

즉, 언어는 비표준 부울에 대해 전적으로 염려하지 않을 것입니다. 특정 구현 (CIL의 MS C#에서와 같이)은 비표준 부울의 존재를 인정하고 그 행동을 다음과 같이 지정합니다. 한정되지 않은

위키를 살펴보면 정의되지 않은 행동이 발생하는 상황은 허용되지 않거나 C#에서 예외를 던집니다.

그러나 안전하지 않은 코드에서는 정의되지 않은 행동이 가능하다고 생각합니다.

편집 : 내가 옳은 것 같습니다. http://msdn.microsoft.com/en-us/library/aa664771%28vs.71%29.aspx

C#에서 정의되지 않은 동작의 예가 있습니다.

ECMA-334 문서 (p. 473)에 따르면 :

안전하지 않은 수정 자의 발생을 포함하지 않는 프로그램은 정의되지 않은 동작을 나타낼 수 없습니다.

이는 '구현 정의 된'최악의 경우를 촉진합니다. Eric Lippert의 답변을 참조하십시오.

많은 및 하위 프로그램에는 다음과 같이 요약 할 수있는 요구 사항이 있습니다.

  1. 유효한 데이터가 주어지면 유효한 출력을 생성하십시오.

  2. 잘못된 입력이 주어진 경우에도 핵 미사일을 발사하거나 시간과 인과 관계의 법칙을 부정하지 마십시오.

Java 및 .NET Languages의 주요 설계 목표 중 하나는 코드가 "안전하지 않은"것으로 표시된 특정 코드를 사용하지 않는 한 위의 두 번째 제약 조건을 충족시키기 위해 일반적으로 특정 노력이 필요하지 않다는 것입니다. Finalize 시간/인과성 관점에서 조금 이상 할 수 있으며, 이들은 전체 철회가 아니라 정상적인 인과 관계 규칙에 대한 예외로 설명 될 수 있습니다]. 이러한 상황은 C의 상황과는 매우 다릅니다. C의 상황과는 매우 다릅니다. 많은 종류의 데이터 의존적 오류 (예 : 정수 오버플로)가 오버플로를 피하기 위해 모든 가정을 만드는 것을 포함하여 임의의 방식으로 컴파일러가 작동 할 수있는 C의 상황과는 매우 다릅니다. 초대 C 철학에서 장려되는 진정으로 끔찍한 종류의 정의되지 않은 행동은 "안전하지 않은"블록 이외의 C# 또는 다른 .NET 언어에는 존재하지 않습니다.

실제로 Wiki Sense는 아니지만 내 마음에 오는 가장 명백한 예는 단순히 스레드 코드를 작성하는 것이지만 모든 언어에서는 그렇습니다.

일반적으로 나는 거절합니다.

초기화되기 전에 자동 변수를 사용하십시오.

모든 변수는 초기화되어야합니다. 예외가 발생하지 않으면

0으로 나누기

예외가 발생합니다.

배열을 바운드에서 인덱싱합니다

예외가 발생합니다

Aequitarum Custos가 지적했듯이 안전하지 않은 코드를 사용할 수 있습니다. 그런 다음 다시 이것은 C#이 아닙니다. C# 환경을 명시 적으로 선택하고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top