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 .値への直接アクセスですか? Valueディクショナリ( 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;

これにより、辞書に 1 バイトを簡単に書き込むことができます。もちろん、コンストラクターを呼び出して各 TMyBuf を割り当てる必要があります。同様に、配置されたすべてのオブジェクト参照を所有できる (つまり、解放する方法を知っている) TObjectDictionary を使用すると、クリーンアップが簡単になります。

あなたが知らないかもしれないもう 1 つのことは、Unicode delphi では、string[50]は古い TurboPascal/DOS 時代のshortstring型であり、Unicode 文字列ではないということです。

本当に必要でない限り、string[50] の使用を気にせず、単純に string を使用することをお勧めします。文字列が 50 文字以下であることを実行時に検証して例外をスローする場合は、そのようにします。

于 2013-03-28T11:09:22.740 に答える