4

私はいくつかのデータ解析を行っており、この問題に遭遇しました。一部byte[]を構造体に解析したいとしましょう。それを行う C# コードを静的メソッドにラップしたいと考えています。

元のコード(私は一部を作り直しています)は次のとおりです。

public class DiagnosticUndefined : BaseDiagnostic
{
    StructDiagnosticUndefined bufferAllocation;

    public DiagnosticUndefined(byte[] buff)
    {
        bufferAllocation = (StructDiagnosticUndefined)DiagnosticUtil.parseStruct(buff, typeof(StructDiagnosticUndefined));
    }
}

そのためにジェネリック関数を使用したいのですが、どうすればよいですか?検討:

public static class Util {
    public static T Convert<T>(byte[] data) {...}
    public static void Convert<T>(byte[] data, out T structure) {...}
}

最初の手順は通常の手順とよりインラインですが、コンパイラがデータ型を推測できないという欠点があるため、呼び出しは次のようになります。

SomeStruct s;
s = Util.Convert<SomeStruct>(data);

他のアプローチはこれです:

SomeStruct s;
Util.Convert(data, out s);

2 番目のアプローチは、型推論をコンパイラに委譲するため、実行時エラーが少ないので気に入っています。一方、MSDN でサポートされている out パラメータの使用を避ける傾向があります: http://msdn.microsoft.com/en-us/library/ms182131.aspx。私は「複雑な方法で単純な問題を解決しない」パラダイムに大賛成ですが、今回は区別できません...

ヒント、意見はありますか?

アップデート

コード例は簡略化されており、変数は実際にはメンバーであるため、「1 行」にすることはできません。また、マーシャリングを使用してデータを構造に変換しています。

GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);
T output = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
handle.Free();
4

4 に答える 4

2

最初のものを次のように変更します。

SomeStruct s = Util.Convert<SomeStruct>(data); 

そしてそれで行きます。

その理由は、読み取りおよび保守するコードが少ないためです。

于 2012-09-12T08:06:45.197 に答える
1

@Nebulaが提案した編集

最初のケースは、完全に有効なようです:

var s = Util.Convert<SomeStruct>(data);

宣言的な目的ではなくout、呼び出しから何かを返したい場合に使用します。

于 2012-09-12T08:05:53.577 に答える
1

SomeStructオブジェクトを作成する必要のない、両方のアプローチ:

 SomeStruct s = new SomeStruct();

Convertメソッド内でこのオブジェクトを作成すると思うからです。2 番目のアプローチでは、正確性は次のようになります。

SomeStruct s;
Util.Convert(data, out s);

out引数を初期化する必要がないためです。のプロパティを変更するだけでs、ポインターを変更したり、内部Convertでオブジェクトを作成したりしない場合は、次のoutことも必要ありません。

SomeStruct s = new SomeStruct();
Util.Convert(data, s);

私見、アプローチ1はより良く、より読みやすいはずです。

于 2012-09-12T08:12:02.943 に答える
0

この場合にジェネリックを使用しても、大きな利点はないと確信しています。しかし、もしあなたが主張するなら... 何が悪いの?

var s = Util.Convert<SomeStruct>(d);

また、変換と解析は同じものではありません。同じ意味で使用しないでください。

于 2012-09-12T08:09:39.750 に答える