2009-11-09 2 views

답변

16

여기는 answer입니다.

사전 가 발생 주된 이유는 해시 테이블 키는 항상 참조 타입이기 때문에 null을 반환 할 수있는 V. 이상 작동에는 "오류" 가치가 없다는 것입니다.

+0

주목할만한 점 :'HashTable'은 이런 식으로 비표준 코드를 쓸 수있게합니다. 'var ht = new Hashtable() {{ "A", null}}; 문자열 aVal = (문자열) ht [ "A"]; string bVal = (string) ht [ "B"];'모두 null을 반환하면 유효한 값이나 존재하지 않는 키를 구별 할 수 없습니다. 적어도 버그는 숨겨져 있으며 침묵은 더욱 심각합니다. 사전은 예외를 알려줍니다. –

6

사전 [key]의 값이 null 값을 저장할 때와 키가 존재하지 않을 때 사이에 모호성이 없습니다. Hashtable [key]는 null을 저장하거나 키가 존재하지 않으면 null을 반환합니다.

2

사전이 던지는 주된 이유는 정치적입니다. 효율성과 사용 편의성을 유지하는 몇 가지 옵션이있었습니다. 실제적으로 합리적인 가치를 반환하는 "무능력"에 대한 주장이 거짓임을 분명히 보여주는 방법 (TryGetValue)을 제공합니다. 그러나 TryGetValue는 뚜렷하게 어색한 구문을 사용하여 인덱서가 쉽게 수행 할 수있는 작업을 수행합니다.

C# 템플릿은 참조 및 값 의미에 대해 별도의 구현을 구성하는 쉬운 방법을 제공하며 tempante 및 일부 연산자 (기본값 및 nullable)가 사용하는 값 ​​의미가있는 누락 된 개체를 완벽하게 처리하는 두 가지 기능이 있습니다. 해쉬 테이블의 의미를 깨뜨릴 합리적인 이유가 없다는 것을 의미합니다.

모든 사람이 수표를 가지고 가야한다는 콜렉션의 학술적 개념과 그러한 인공 절차가 비효율적이며 실 안전성을 깨뜨리는 실제적인 사실 사이의 정치적 투쟁은 오랜 기간입니다 (액세스가 비 원자 (non-atomic)로 만들어서 안전하지 않은 구현의 스레드 안전성을 손상시킵니다.

+2

'TryXX' 패턴은 실패했을 때 메소드가'default (T)'를 반환하지만'out bool' 파라미터를 사용하여 그것이 작동했는지 여부를 나타 내기를 희망합니다. 이것은'book ok; var theValue = myDict.TryGetValue (myKey, out ok); if (ok) ...'. 그러한 패턴은 형식 유추와 공분산을 허용 할뿐만 아니라, 존재하지 않는 키에 대해 원하는 동작이'default (T)'값을 갖는 경우를 용이하게합니다. – supercat

관련 문제