我使用的是<string, string>
的TDictionary
。但出於某種原因,鏈接器決定我不想從中取出項目。GetItem on TDictionary由鏈接器提供
我有以下代碼:
function TSheet.GetFieldName(Field: string; Default: string): string;
begin
Result := Default;
if FFieldNames[Field] = '' then
Result := Field
else
Result := FFieldNames[Field];
end;
FFieldNames
是一個TDictionary<string, string>
。在第2行(if FFieldNames[Field] = '' then
),它會拋出'文件未找到'異常。將FFieldNames[Field]
添加到我的手錶告訴我要調用的函數{System.Generics.Collections} TDictionary.GetItem被鏈接器取消。
Someone asked here on a similar issue關於如何在調試過程中避免鏈接器消除功能。從我收集的信息來看,編譯器/鏈接器假定我沒有使用它。有人建議 - 在對話期間 - 我應該嘗試使用它更多。
因此,我創建了下面的代碼:
FFieldNames.Add(Name, S);
V := FFieldNames.Items[Name];
凡S
,Name
和V
都是字符串。這是來自FFieldNames
充滿數據的代碼。 V
的唯一目的是獲得剛插入的S
;它什麼都不做。
奇怪的是,雖然調試器告訴我同樣的事情(即GetItem
被淘汰),但V
確實設置爲預期值。但它不在我的TSheet.GetFieldName
函數中。 :|
我錯過了什麼?
我覺得你的代碼是錯誤的反正。如果該鍵不存在,則使用'Items []'將導致異常。你需要'TryGetValue'。而且你還需要確保你不會查找兩次的值。如果不是FFieldNames.TryGetValue(Field,Result),那麼Result:= Default;'或者你的意思是,如果不是FFieldNames.TryGetValue(Field,Result),那麼Result:= Default;'。另外,由於您總是覆蓋,所以'Result:= Default'毫無意義。編譯器會告訴你,如果你打開警告。 – 2013-03-08 09:52:03
這個錯誤只發生在似乎與泛型混淆的調試器中。你的錯誤絕對不是由連接器造成的。 – jpfollenius 2013-03-08 10:18:56
我發佈後我意識到自己的錯誤;使用'ContainsKey()'使它工作!但Heffernan提出的'TryGetValue'也是一個好主意。感謝那。 – Svip 2013-03-08 10:48:37