Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 链接器删除的TDictionary上的GetItem_Delphi_Linker_Tdictionary - Fatal编程技术网

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上尝试了这种方法,但没有成功。链接器仍然删除了相关的访问方法。