0

我有数百个变量必须用一个键访问。
键的类型是字符串(最大: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.有没有更好的办法?

4

1 回答 1

2

您最好利用类的隐式引用语义并使用 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 字符串。

我建议除非你真的需要,否则不要担心使用 string[50] 并简单地使用 string. 如果您希望在运行时验证字符串是否为 50 个字符或更少并抛出异常,那么就这样做。

于 2013-03-28T11:09:22.740 回答