문제

나는 점을 이해하고 희귀한 해야에서 그들을 사용하는 C#코드입니다.나의 질문은:무엇 뒤에 가 명시적으로하지 않는 블록의 코드입니다.또한,해야 하는 이유는 무엇 컴파일러 옵션을 변경될 수 있"안전하지 않은"코드가?

Bottom Line: 에서 무엇 CLR(또는 언어양)에게 그것은 그래서 우리는 할 수 있지 않을 사용할 때마다 포인터리(많은 C 및 C++)하지 않고 형식"안전하지 않은"와 컴파일러 옵션?

설명:내가 무엇을 알고"안전하지 않은"와"안전한"코드입니다.그것은 단지 질문지의 이유 우리가 해야 할 일은 모든 추가 작업(ok,지 않는 많은 추가)을 사용할 수 있는 이러한 특징입니다.

도움이 되었습니까?

해결책

C# Creator Anders Hejlsberg와의 인터뷰가 주제에 대한 인터뷰가 있습니다. 여기. 기본적으로 @MARC Gravell이 말한 것과 정확히 다음과 같습니다. TypeSAFETY FIRST, 명시 적 선언에 의한 안전성.

따라서 귀하의 질문에 답하기 위해 : CLR의 어떤 것도 그것을 막을 수 없습니다. 유형을 다룰 때 안전 장갑으로 작업 할 수 있도록 설계된 언어 관용구입니다. 장갑을 벗고 싶다면 그것은 당신의 선택이지만, 장갑을 벗기 위해 적극적인 선택을해야합니다.

편집하다:

설명을 위해 : "안전하지 않은"코드가 무엇인지 알고 있습니다. 이 기능을 사용할 수 있도록 왜 우리가 왜 우리가 모든 추가 작업을 수행 해야하는지에 대한 질문 일뿐입니다.

인터뷰에서 언급했듯이, 나는 연결된 디자인 결정이었습니다. C#은 본질적으로 Java의 진화이며 Java에는 전혀 포인터가 없습니다. 그러나 디자이너들은 포인터를 허용하기를 원했습니다. 그러나 C#은 일반적으로 Java 개발자를 가져 오기 때문에 기본 행동은 Java와 유사합니다. 즉, 명시 적 선언에 의해 포인터를 사용할 수있게하는 동시에 포인터가 없습니다.

따라서 "추가 작업"은 고의적으로 당신이 그것을하기 전에 당신이하고있는 일에 대해 생각하도록 강요합니다. 명시 적으로, 그것은 당신을 최소한 고려하도록 강요합니다. "내가 왜 이것을하고 있습니까? 진짜 참조 유형이 충분할 때 포인터가 필요하십니까? "

다른 팁

그것은 대부분 검증 가능한 것에 관한 것입니다. 진술함으로써 unsafe, 장갑이 꺼져 있습니다 - 시스템은 더 이상 코드가 실행되지 않을 것을 보장 할 수 없습니다. 대부분의 경우 안전 지대에 머무르는 것이 매우 바람직합니다.

이것은 부분 신뢰 (addins 등)에서 더욱 눈에 띄게되지만 여전히 일반 코드에서는 여전히 가치가 있습니다.

실제로 CLR은 /안전하지 않은 스위치 또는 키워드에 대해 전혀 요구하지 않습니다. 실제로 C ++ /CLI (CLR에서 실행되는 C ++ 언어)에는 그러한 /안전하지 않은 스위치가 없으며 포인터는 CLR에 자유롭게 사용할 수 있습니다.

그래서 나는 당신의 질문을 "c#은 왜 포인터를 사용하기 전에 /안전하지 않은 이유는 무엇입니까?" 그리고 그 질문에 대한 답은 여기에 주어진 다른 답변에 명시된 바와 같이 다음과 같습니다. 사용자가 CLR에서 완전한 신뢰 모드보다 적은 수준의 실행 능력을 상실하기로 한 의식적인 결정을 내릴 수 있도록 도와줍니다. C ++는 사실상 CLR에 대한 완전한 신뢰가 필요하며 C# ~할 수 있다 완전한 신뢰가 필요한 코드를 호출하거나 포인터를 사용할 때마다.

을 사용할 때 안전하지 않은 블록을 만드는 효과가 있 코드를 확인할 수 없는.이 특정 권한이 필요합을 실행하지 않을 수도 있습할 수 있도록에서의 출력을(있는 경우에 특히 공동 소스환경),그래서 거기에 있는 스위치 컴파일러를 허용하지 않습니다.

반대의 관점에서 생각해보십시오. 안전하지 않기 때문에 대부분의 코드가 기본적으로 "안전한"것으로 추론 할 수 있습니다. 그렇다면 "안전한"것은 무엇을 의미합니까? .NET 코드의 경우 여기에는 다음이 포함됩니다 (하지만 제한되지는 않음).

  • 쓰레기 수집가는 평소와 같이 사업을 할 수 있습니다.
  • 특정 유형에 대한 참조 ~ 할 것이다 해당 유형 (또는 NULL)의 객체를 참조하십시오.
  • 코드는 .NET 신뢰/보안 요구 사항을 준수하도록 보장됩니다.
  • 코드는 수학적으로 자체 appdomain 외부에서 메모리를 직접 터치하지 않는 것으로 입증되었습니다. 사소한 것처럼 보일 수 있지만 동일한 응용 프로그램에 여러 appdomains가 있다고 상상해보십시오. 프로그래머는 그들을 논리적으로 분리 된 것으로 자신있게 취급 할 수 있습니다.

포인터를 사용할 때마다 그러한 보증을 중단 할 기회가 있습니다. 따라서 코드를 안전하지 않은 것으로 표시하면 이러한 보호를 포기합니다.

요컨대, .net은 당신이 당신의 의도를 진술하기를 원합니다.

물론, 컴파일러는 "안전하지 않은"플래그의 필요성을 유추 할 수 있습니다. 그러나 디자이너들은 그것이 의도적 인 결정이되기를 원합니다.

나에게 그것은 C#의 여러 구문 요구 사항과 유사하다.

  • 휴식이없는 스위치 케이스가 없습니다
  • 액세스 레벨 "섹션"없음 (예 : "공개 : C ++의 마커)
  • "var"를 사용하는 클래스 필드 없음

패턴은 한 가지를 움직이거나 변경해서는 안되며 실수로 다른 사람에게 영향을 미치지 않아야한다는 것입니다. 이유에서 그들은 당신이 "발에 자신을 쏘는"것을 막기를 원합니다.

여기에 많은 훌륭한 유익한 답변이 있습니다. 아마도 이것은 당신의 질문에 더 많이 갈 것입니다.

따라서 권한이 높아지지 않고 웹 서비스에서 실행되지 않는 코드가 즉시 분명합니다.

좋은 습관과 안전을 육성합니다. 어셈블리에서 안전하지 않은 블록을 사용할 때마다 스택에서 nativecode 권한이 요구됩니다. 물론 이것은 암시 적으로 수행 될 수 있지만 개인 키워드를 완전히 제거 할 수는 없습니까? 개발자가 사용하기 전에 안전하지 않은 코드를 구체적으로 요구하도록 강요하는 것이 좋다고 생각합니다.

안전한 코드와 안전하지 않은 코드의 가장 중요한 차이점은 .NET의 쓰레기 수집가가 안전하지 않은 코드를 연락 할 수 없다는 것입니다. 자동 GC는 .NET Vernacular의 큰 부분이며, 경계를 넘어 서면 코드에 대해 가정 할 수있는 것들이 많이 변경됩니다.

포인터는 특히 GC 참조가없는 힙에 객체를 생성 할 수 있습니다. 이것은 코드를 "안전하지 않은"것으로 표시 해야하는 또 다른 훌륭한 이유로 이어집니다. 메모리 누출이 나오는 곳에서 쉽게 좁을 수 있습니다.

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