2009-04-15 6 views
2

더 많은 코드를 작성해야하므로 테스트되지 않았습니다. 그러나 이것이 정확하고 나는 이것이 더 잘 쓰여질 수있는 것처럼 뭔가를 놓치고있는 것처럼 느낍니다. 마지막에 c.lose가 필요한가요? 나는 아무것도 플러시해야합니까? (내가 닫으면()하면 안된다)?int []에서 byte []로, 뭔가 잊고 있습니까?

Byte[] buffer; 
using (var m = new MemoryStream()) 
{ 
    using (var binWriter = new BinaryWriter(m)) 
    { 
     foreach (var v in wordIDs) 
      binWriter.Write(v); 
     binWriter.Close(); 
    } 
    buffer = m.GetBuffer(); 
    m.Close(); 
} 

답변

0

여기에는 닫기가 필요하지 않습니다. using 문은 이러한 유형의 Dispose 메소드가 exit시 호출되도록하며 Close를 호출하는 것과 동일한 효과를 갖습니다. 실제로 리플렉터의 코드를 살펴보면 두 경우 모두 Close가 두 유형의 Dispose 메소드를 프록시한다는 것을 알 수 있습니다.

4

당신은 .Close() 호출 (자동 생성 .Dispose() 생성 블록이 그것들을 처리합니다)이 필요하지 않습니다.

또한 .GetBuffer()가 아니라 MemoryStream에서 .ToArray()를 사용하려고합니다. GetBuffer()는 사용 된 버퍼의 수와 상관없이 기본 버퍼를 반환합니다. ToArray()는 완벽한 길이의 복사본을 반환합니다.

다른 프로그램과 통신하는 데 사용하는 경우 바이트 순서 (일명 엔디안)에 동의하는지 확인하십시오. 네트워크 바이트 순서를 사용하는 경우 바이트 순서 (예 : IPAddress.HostToNetworkOrder())를 사용하여 네트워크 바이트 순서가 빅 엔디안이고 BinaryWriter가 리틀 엔디안을 사용하므로 바이트 순서를 바꿔야합니다.

0

따라서 sayeth Skeet :

중 하나 MemoryStream을하거나 BinaryWriter을 닫습니다 진짜 필요가 없습니다

하지만 나는 그것이 모두를 처리하기 위해 사용 문을 사용하기 좋은 형태로 생각 - 을 그 당신이 나중에 로 변경하면, 이 필요합니다. 을 처분해야합니다. 이것은 동일한 코드에 맞을 것입니다.

그래서 Close 또는 using 문은 필요하지 않지만 사용법은 관용적 인 C#입니다.

2

wordID는 무엇입니까? 열거 형입니까, 아니면 Int32 []입니까? 그냥 INT32 [] 인 경우 다음을 사용할 수 있습니다 wordIDs 당신이 단계별한다 열거 경우,

byte[] bytes = new byte[wordIDs.Length * 4]; 
Buffer.BlockCopy(wordIDs, 0, bytes, 0, bytes.Length); 

그렇지 않으면 변경할 필요는 m.Close (언급 한 바와 같이) 사용을 제거하다 MemoryStream.ToArray (언급 된대로).

0

JaredPar와 Jonathan의 답변이 정확합니다. 대안을 원하면 BitConverter.GetBytes(int)을 사용하십시오. 이제 코드가이 코드로 바뀝니다

wordIDs.SelectMany(i => BitConverter.GetBytes(i)); 
+0

또는 BitConverter를 사용할 수 있습니다.GetBytes (int), 그리고 IPAddress.HostToNetworkOrder()를 사용하여 바이트를 반전해야합니다. –

+0

@Jonathan : 그것을 할 수있는 기능이 있어야한다는 것을 알았습니다. 그 이름을 기억할 수 없었습니다. – Samuel

0

여기에있는 Skeet과 동의하지 않습니다.

은 (는)이 필요합니다. Dispose 메서드를 사용하여 BinaryWriter 및 MemoryStream 구현에 의존하고 있습니다. 이것은 프레임 워크 유형에는 해당되지만, 누군가가 작성자 또는 스트림을 작성하지 않는 경우에는 어떻게해야합니까?

닫기를 추가해도 해를 끼치 지 않으며 잘못 작성된 클래스로부터 보호받을 수 있습니다.

+1

아직 존재하지 않는 불량 클래스로부터 자신을 보호 할 필요가 없습니다. 좋은 코딩 이유는 없기 때문에 노이즈가 추가되기 때문입니다. "누군가가 올바른 방법으로 뭔가를하지 않으면 어떨까요?"라는 말은 여분의 진술로 코드를 오염시키는 좋은 변명이 아닙니다. –

+1

소음이 전혀 들리지 않는 것을 제외하고는 표현력이 풍부하고 구체적입니다. 방어 프로그래밍은 공해가 아닙니다. – blowdart

+0

Dispose()는 항상 IDisposable을 구현하는 리소스 기반 클래스를 닫아야합니다. 그렇지 않으면 제대로 구현되지 않습니다. – Melllvar

관련 문제