문제

C# 코드에서 포인터를 사용해야합니까? 이점은 무엇입니까? 남자 (Microsoft)가 추천합니까?

도움이 되었습니까?

해결책

"남자"자신에게서 :

포인터의 사용은 C#에서는 거의 필요하지 않지만 필요한 상황이 필요합니다. 예를 들어, 안전하지 않은 컨텍스트를 사용하여 포인터를 허용하는 것은 다음과 같은 경우에 보증됩니다.

  • 디스크의 기존 구조 처리
  • 고급 COM 또는 플랫폼은 포인터가있는 구조와 관련된 시나리오를 호출합니다.
  • 성능 크리티컬 코드

다른 상황에서 안전하지 않은 맥락의 사용은 권장되지 않습니다.

구체적으로, 안전하지 않은 컨텍스트를 사용해서는 안됩니다. C#에서 C 코드를 작성하려고 시도해야합니다.

주의:

안전하지 않은 컨텍스트를 사용하여 작성된 코드는 안전한 것으로 확인할 수 없으므로 코드가 완전히 신뢰할 때만 실행됩니다. 다시 말해, 신뢰할 수없는 환경에서 안전하지 않은 코드를 실행할 수 없습니다. 예를 들어 인터넷에서 직접 안전하지 않은 코드를 실행할 수 없습니다.

참조

다른 팁

해야한다면.

2000x2000 픽셀 (2000x2000 픽셀)이라는 큰 그레이 스케일 이미지를 잘못 색상으로 만들어야한다고 가정하십시오. 먼저 '안전한'버전을 사용하여 작성하십시오 GetPixel() 그리고 SetPixel(). 그것이 효과가 있다면, 계속해서 움직입니다. 그것이 너무 느린 것으로 판명되면, 이미지를 구성하는 실제 비트를 가져와야 할 수도 있습니다 (예를 위해 색상 행렬을 잊어 버리십시오). 안전하지 않은 코드를 사용하는 것에 대한 '나쁜'것은 없지만 프로젝트에 복잡성이 추가되므로 필요할 때만 사용해야합니다.

나는 그렇게해야 할 일을 기억할 수 없지만 인터 로프를 많이하지 않았습니다. 이것이 가장 일반적인 응용 프로그램입니다. 저는 기본 코드로 부릅니다. 포인터를 사용하면 일부 코드를 최적화 할 수있는 곳이 거의 있지만 내 경험에서는 매우 드 rare니다.

그것이 가이드라면, 나는 C#에서 꽤 경험이 많다고 생각하지만 안전하지 않은 코드를 수행해야한다면 Spec/Books/MSDN과 상담하여 나를 안내해야합니다. 물론 안전하지 않은 코드에 만족하지만 쿼리 표현식에 익숙하지 않은 많은 사람들이있을 것입니다 ...

주요 문제는 다음과 같습니다.-

  • 안전하지 않은 코드는 검증 할 수 없습니다. 이것은 코드가 할 수 있음을 의미합니다 완전히 신뢰할 수있는 컨텍스트의 사용자가 사용자가 운영해야하므로, 완전히 신뢰할 수있는 것보다 적은 곳에서 코드를 실행할 수있는 사용자가 필요한 경우 (예 : 네트워크 공유가 구성되지 않도록 구성되지 않음).
  • 검증 가능성 부족 (실제로 단어인지 확실하지 않음) 잠재적으로 프로그램에서 메모리를 엉망으로 만들었습니다. 당신은 잠재적으로 전체 클래스의 버그를 애플리케이션에 다시 가져 오는 것 - 버퍼 오버런, 매달린 포인터, Yada Yada Yuck Yuck. 포인터가 이상하게 진행되는 시점을 깨닫지 않고 메모리에서 데이터 구조를 손상시킬 수있는 것은 말할 것도 없습니다.
  • 안전하지 않은 코드가 관리 된 객체에 액세스하도록하려면 '고정'해야합니다. 이는 GC가 메모리에서 객체를 움직일 수 없으므로 관리 된 힙이 조각화 될 수 있음을 의미합니다. 이것은 성능에 영향을 미칩니다. 그러므로이 문제의 잠재적 성능 게인이 더 중요하지 않은지 여부를 결정하는 것이 항상 중요합니다.
  • 관리되지 않는 접근 방식에 익숙하지 않은 프로그래머에 대해 코드가 이해하기 어려워집니다. 그런 다음 '자유'안전하지 않은 코드로 발을 쏘는 데 더 많은 책임이있을 수 있습니다.
  • 당신은 유형의 안전 코드를 쓸 수있게됩니다. 이것은 오히려 멋진 따뜻한 퍼지 관리 언어의 많은 이점을 제거합니다. 이제 끔찍한 유형 안전 문제를 겪을 수 있습니다. 왜 그 단계를 거꾸로 가져 가야합니까?
  • 그것은 당신의 코드를 만듭니다 추악한.

목록에 추가 될 수있는 더 많은 것이 있다고 확신합니다. 일반적으로 다른 사람들이 말했듯이, 당신이하지 않으면 피하십시오. 그럼에도 불구하고 마샬러는 대부분 필요를 막을 것입니다.

'남자'는 또한 필요하지 않으면 기본적으로 피하십시오.

오, 고정에 관한 좋은 기사 여기 MSDN에서 그런데.

안전하지 않은 코드 .NET CLR의 완전히 지원되는 기능입니다. 이점은 이진 코드와의 성능과 호환성입니다. 런타임은 샌드 박스이므로 충돌 및 연소를 방지하지만 비용이 발생합니다. 메모리의 큰 덩어리에 대해 매우 집중적 인 작업을 수행하는 상황 (예 : 이미지 조작)은 런타임이 제공하는 정상 안전을 벗어나는 것이 더 빠릅니다.

그 말은 생각합니다 대부분 여기 사람들은 "하지 마라"고 말할 것입니다. .NET 개발자의 대다수는 안전하지 않은 코드를 사용해야만 해결할 수있는 일반적인 활동에서 사례에 부딪치지 않습니다.

나는 안전하지 않은 코드를 사용하여 사칭을 사용하여 서비스가 네트워크 공유에 액세스 할 수 있도록했습니다. 당신이하고있는 일을 알고 있다면 문제가되지 않습니다.

필요한 경우 사용해야합니다. 대부분 까다로운 인터 로프 시나리오를 다룰 때 (예를 들어 .NET 1.0에서 DPAPI에 대한 관리 래퍼를 썼을 때)가 필요했지만 때때로 가끔 프로파일 링 후 (프로파일 링 후) stackalloc 또는 유사합니다.

Microsoft는 C#의 디자이너만큼 권장되며 작성 기능을 추가하기로 결정했습니다. unsafe 코드. 키워드 선택 및 키워드를 사용하여 작성하는 메소드/클래스를 묘사하려는 요구 사항에서 볼 수 있으며, 이는 사실이 구현 선택이 아니라고 설계되지 않았습니다.

비트 컨버터가 제공하지 않은 캐스트와 같은 재 해석.
구체적으로 unt를 int for hash 함수로 변환하는 것은 비트입니다.

잘 알려진 길이의 바이트*로 취급 해야하는 스트러크에서 C 또는 C ++ 관용 기능에 대해 유용하고 잘 합당한 일부를 사용하여 다시 해싱에 가장 유용합니다.

메모리 스트러크에서 (매우 구체적인)의 매우 빠른 바이너리 직렬화 (배열로 수행 함)는 C ++/CLI로 떨어 뜨려서 더 잘 수행됩니다.

많은 경우 포인터를 요구하는 작업을 C ++/CLI로 수행 한 다음 DLL으로 C# 프로젝트로 가져 와서 더 잘 해결할 수 있다고 말해야합니다. 코드가 '안전한'것인지 아닌지는 변경되지 않지만 포인터 기반 구조에서 작동하는 데 도움이되는 유용한 기능을 많이 만듭니다. 또한 실제로 원한다면 일반적인 유형이나 열거를 엉망으로 만들 수 있습니다.

대부분의 개발자 가이 작업을 수행 해야하는 가능성은 실제로 원격입니다. 그래도 필요할 때 유용합니다 ...

물론 "권장"이 아니기 때문에 "안전하지 않은"이라는 레이블이 지정됩니다. 그러나 그것이 당신을 두려워하게하지 마십시오. 그러나 코드를 두 번 볼 수 있어야합니다. 아마도 그것을하는 방법이 있습니까?

안전하지 않은 코드를 사용하는 것은 .NET 프레임 워크의 Benenfits를 잊어 버리는 것과 같습니다. 한 번은 스택 및 물건과 같은 구식 구조물을 만들기 위해 한 번 사용했지만 학교에만 사용되었습니다. 요즘에는 사용해야 할 필요가 없었습니다.

코드가 더 짧고 명확 해지면 그렇게하십시오.

"구석 구석 경찰관과 관련하여 성향을 따르십시오." WSM

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