我有数百个必须用钥匙访问的变量
键的类型是字符串(最大值:50个字符),数据是字节数组(最大值:500字节)。
我用这种方式:
定义这种类型:
type
TMyBuf = array[0..(500-1)] of Byte;
TMyKey = string[50];
TMyBufs = TDictionary<TMyKey,TMyBuf>;
var
MyBufs :TMyBufs;
并使用:
var vMyBuf :TMyBuf;
vMyData :TBytes ABSOLUTE vMyBuf;
vMyDataLen :Word;
begin
List := srvData.Contexts.LockList;
SetLength(vMyBuf, 500);
try
if(List.Count > 0) then begin
for i := 0 to List.Count-1 do begin
with TMyContext(List[I]) do begin
if SetedIdent then begin
try
vMyBuf:= MyBufs.Items[SeledData];
//extract length of data which stored in two byte
vMyDataLen:= ( ( (vMyBuf[1] shl 8)and $FF00) or (vMyBuf[0] and $FF) );
Connection.IOHandler.Write(vMYData, vMYDataLen);
finally
end;
end;
end;
end;
end;
finally
srvData.Contexts.UnlockList;
SetLength(vMyBuf, 0);
end;
end;
有类似的代码来写数据。
1 。是否直接访问了价值观?无需复制值字典(vMyBuf:= MyBufs.Items[SeledData];
)。
2 。有更好的方法吗?
答案 0 :(得分:2)
最好使用Classes的隐式by-reference语义 并使用TObjectDictionary。
type
TMyBuf = class
public
Data:array[0..(500-1)] of Byte;
end;
TMyKey = string[50];
TMyBufs = TObjectDictionary<TMyKey,TMyBuf>;
var
MyBufs :TMyBufs;
这将允许您轻松地将单个字节写入字典。你当然必须通过调用它的构造函数来分配每个TMyBuf。如果您使用TObjectDictionary,它可以拥有(意味着知道如何释放)放入其中的所有对象引用,那么清理也会更容易。
您可能不知道的另一件事是,在Unicode delphi上,string[50]
是一个古老的TurboPascal / DOS时代shortstring
类型,而不是unicode字符串。
我建议除非你真的需要,否则你不用担心使用字符串[50]而只是使用字符串。如果您希望在运行时验证字符串是50个字符或更少并抛出异常,那么就这样做。