2014-09-25 1 views
5

는 전시 A에 대해 다음과 같은 코드를 가지고 : 사전에TryGetValue - 초기화되지 않은 값 전달 OK?

string sql; 
if (!GetQueries.TryGetValue(type.TypeHandle, out sql)) 

문서는 키가 발견되지 않는 경우, 참조 유형이 null로 설정됩니다 말한다. 좋아, 괜찮아.

키가 발견되면 변수 'sql'은 어떻게 채워 집니까? 발견 된 키 값이 복제 되었습니까? 발견 된 항목의 개체 유형이 생성 된 후 개체의 내용이 복사됩니까? 안전한가요?

또는 아웃 바운드 개체가 상주 할 수있는 장소를 설정, 호출이 전시 B로 설정해야합니다

var sql = string.Empty; 
if (!GetQueries.TryGetValue(type.TypeHandle, out sql)) 

그런 다음 변수 'SQL'은 초기화되어 객체의 안전한 장소 존재합니다. 내보기에서

(내 질문에 내 C 프로그래밍 일 널 포인터의 내 혐오에서 비롯됩니다.)

+0

['out' C# 참조] (http://msdn.microsoft.com/en-us/library/t3c3bfhx.aspx) "out 인수로 전달 된 변수는 전달되기 전에 초기화 할 필요는 없지만 호출 된 메소드가 리턴하기 전에 메소드에 값을 지정해야합니다. " – Habib

답변

8

, 그것은 값으로 설정하지좋습니다. 결국 그 값은 이고,은 메소드 호출로 대체 될 것입니다 (예외가 발생하지 않는다고 가정 할 때). 그래서 값을 지정하는 것이 무의미한 이유는 무엇입니까? 그것은 단지 독자가 그것이 차이를 만든다고 생각하도록 오도합니다.

out 매개 변수는 점에서 특별한 변수가 호출하기 전에 확실히 할당 될 필요가 없습니다 당신이 값을 제공하기 위해 사용하지만, 호출 후 확실히 할당 될 것입니다. 호출 이전의 모든 값은 메서드에 표시되지 않습니다.

은 (ref 매개 변수가 그런 식으로 행동하지 않는 것이 주 - 확실히 사전에 할당해야합니다.)

는 C#에서 다른 매개 변수 모드에 대한 자세한 내용은 C# argument passing에 나의 기사를 참조하십시오.

키가 발견되면 변수 'sql'은 어떻게 채워 집니까? 발견 된 키 값이 복제 되었습니까? 발견 된 항목에 대한 개체 유형이 생성되고 개체의 내용이 복사됩니까?

메서드 내의 매개 변수 값은 일반 할당과 동일한 방식으로 호출자 코드의 변수 값이됩니다. 개체 복제가 진행되지 않습니다.

+1

'ref' 매개 변수가'out' 매개 변수와 다른 점은 함수에 전달되기 전에 반드시 초기화되어야한다는 점입니다. – Anthony

+0

@Anthony : 그래, 그 세부 사항을 추가합니다. –

+0

또한 변수를 값으로 초기화 한 다음 TryGetValue에 전달하면 Resharper와 같은 적절한 코드 분석 도구가 변수에 사용되지 않는 값이 할당되었다는 경고를 표시하고 해당 변수를 제거하도록 권유합니다. 불필요한 초기화. –

0

키가 발견되면 변수 'sql'은 어떻게 채워 집니까?

이처럼 생각할 수 :

var sql = GetQueries[type.TypeHandle]; 

또는 아웃 바운드 개체가 상주 할 수있는 장소를 설정, 통화가 전시 B로 설정해야합니다

사실 상관 없어요. 인수로 전달하므로 sql을 값으로 초기화 할 필요가 없습니다.이 함수는 out으로 선언하여 인수의 값을 설정한다는 것을 보장합니다.

관련 문제