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);

我喜欢第二种方法,因为它将类型推断委托给编译器,即更少的运行时错误。另一方面,我倾向于避免使用 MSDN 支持的 out 参数:http: //msdn.microsoft.com/en-us/library/ms182131.aspx。我完全赞成“不要以复杂的方式解决简单问题”的范式,但这次我无法区分......

任何提示,意见?

更新

代码示例被简化了,变量实际上是一个成员,所以我不能“单行”。我还使用编组将数据转换为结构:

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方法中创建了这个对象。对于第二种方法,正确性应该是:

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

因为out不需要初始化参数。如果您只是更改属性s而不更改指针或在内部创建对象Convertout则也不需要:

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 回答