Delphi 链接器删除的TDictionary上的GetItem
我使用的是Delphi 链接器删除的TDictionary上的GetItem,delphi,linker,tdictionary,Delphi,Linker,Tdictionary,我使用的是的t词典。但出于某种原因,链接器决定我不想从中获取项目 我有以下代码: function TSheet.GetFieldName(Field: string; Default: string): string; begin Result := Default; if FFieldNames[Field] = '' then Result := Field else Result := FFieldNames[Field]; end; FFieldNames
的t词典。但出于某种原因,链接器决定我不想从中获取项目
我有以下代码:
function TSheet.GetFieldName(Field: string; Default: string): string;
begin
Result := Default;
if FFieldNames[Field] = '' then
Result := Field
else
Result := FFieldNames[Field];
end;
FFieldNames.Add(Name, S);
V := FFieldNames.Items[Name];
FFieldNames
是一个t字典
。在第2行(如果FFieldNames[Field]='',则
),它抛出一个“未找到文件”异常。将FFieldNames[Field]
添加到我的手表中,告诉我要调用的函数{System.Generics.Collections}TDictionary.GetItem已被链接器删除
如何避免链接器在调试过程中删除函数。从这里我收集到,编译器/链接器假定我没有使用它。在谈话中,有人建议我应该更多地使用它
因此,我创建了以下代码:
function TSheet.GetFieldName(Field: string; Default: string): string;
begin
Result := Default;
if FFieldNames[Field] = '' then
Result := Field
else
Result := FFieldNames[Field];
end;
FFieldNames.Add(Name, S);
V := FFieldNames.Items[Name];
其中,S
、Name
和V
是字符串。这来自代码,其中FFieldNames
填充了数据V
的唯一目的是获取刚刚插入的s
;它没有别的作用
奇怪的是,当调试器告诉我相同的事情时(即GetItem
被删除),V
确实被设置为预期值。但它不在我的t工作表.GetFieldName
函数中:|
我遗漏了什么?同样的问题也适用于TList
。即使代码使用类中的方法,也无法从调试器访问它(“链接器消除了TList上的xxx”)。我想这是泛型的一个问题
如果您创建一个派生类,它就不会有这个问题
type
TMyList = class(TList<TMyObject>)
end;
var
List : TMyList;
begin
...
end;
类型
TMyList=class(TList)
结束;
变量
列表:TMyList;
开始
...
结束;
同样的问题也适用于TList
。即使代码使用类中的方法,也无法从调试器访问它(“链接器消除了TList上的xxx”)。我想这是泛型的一个问题
如果您创建一个派生类,它就不会有这个问题
type
TMyList = class(TList<TMyObject>)
end;
var
List : TMyList;
begin
...
end;
类型
TMyList=class(TList)
结束;
变量
列表:TMyList;
开始
...
结束;
无论如何,我认为你的代码是错的。如果钥匙不存在,则使用Items[]
将导致异常。您需要TryGetValue
。您还需要确保不会两次查找该值。您需要如果不是FFieldNames.TryGetValue(字段,结果),则结果:=字段
或者您的意思可能是如果不是FFieldNames.TryGetValue(字段,结果),那么Result:=Default代码>。而且,Result:=Default
是没有意义的,因为您总是覆盖。编译器会告诉你,如果你打开警告,这个错误只会发生在调试器中,它似乎与泛型混淆了。你的错误肯定不是由链接器引起的。我在发布后不久就意识到了我的错误;使用ContainsKey()
使它工作起来!但赫弗南提出的TryGetValue
也是一个好主意。谢谢。我总是发现我只使用过TryGetValue
。也许这与我使用的dict有关,但我总是希望使用布尔测试而不是异常来处理dict中的key not的情况。为了提高效率,我想在单个操作中查找dict中的key值并进行测试。这意味着我只使用过TryGetValue
。我认为你的代码是错误的。如果钥匙不存在,则使用Items[]
将导致异常。您需要TryGetValue
。您还需要确保不会两次查找该值。您需要如果不是FFieldNames.TryGetValue(字段,结果),则结果:=字段
或者您的意思可能是如果不是FFieldNames.TryGetValue(字段,结果),那么Result:=Default代码>。而且,Result:=Default
是没有意义的,因为您总是覆盖。编译器会告诉你,如果你打开警告,这个错误只会发生在调试器中,它似乎与泛型混淆了。你的错误肯定不是由链接器引起的。我在发布后不久就意识到了我的错误;使用ContainsKey()
使它工作起来!但赫弗南提出的TryGetValue
也是一个好主意。谢谢。我总是发现我只使用过TryGetValue
。也许这与我使用的dict有关,但我总是希望使用布尔测试而不是异常来处理dict中的key not的情况。为了提高效率,我想在单个操作中查找dict中的key值并进行测试。这意味着我只使用过TryGetValue
。这主意不错,但我在TDictionary上尝试了这种方法,但没有成功。链接器仍然删除了相关的访问方法。好主意,但我在TDictionary上尝试了这种方法,但没有成功。链接器仍然删除了相关的访问方法。