2015-06-14 59 views
4

我应该避免使用泛型进行类型检查吗?不使用传统类型检查比较(myvar is int),而是使用类型的typecode。通用类型码型检查?

使用泛型,通过类型检查,您可以创建一个没有支持常规重载方法任务的参数的单个方法。这是无参数方法的问题,它们不能被重载。

// "Buffer" is the byte[] while "Peek" is the read/write position. Then Align" is the alignment size in bytes of the buffer. 
public type Read<type>() { 
    switch(Type.GetTypeCode(typeof(type))) { 
     case System.TypeCode.Boolean: 
      bool bool_val = (Buff[ Peek ] > 0); 
      Peek = (++Peek + (Align - 1)) & ~(Align - 1); 
      return (type)(object)bool_val; 
     case System.TypeCode.Byte: 
      byte byte_val = Buff[ Peek ]; 
      Peek = (++Peek + (Align - 1)) & ~(Align - 1); 
      return (type)(object)byte_val; 
     case TypeCode.Ushort: 
      ushort ushort_val = (ushort)(Buff[ Peek ] | (Buff[ Peek + 1 ] << 8)); 
      Peek += 2; 
      Peek = (Peek + (Align - 1)) & ~(Align - 1); 
      return (type)(object)ushort_val; 
     break; 
     ... 
    } 
} 

这似乎是实现无参数方法重载形式的唯一方法。这被认为是不好的做法?

+0

无论是好还是坏的做法通常都是非常有关联的。你能否提供一些你想要达到的细节? –

+0

好点。我正在为网络系统编写一个缓冲区类。我需要几种类型的读/写方法。然而这对于读取方法来说并不容易,因为它们不能被重载。这迫使我要么使用泛型类型检查,要么使用多个个性化方法 - 从设计的角度来看,这也很糟糕。但是,您可以将此应用于大多数情况下,您只需要一种多功能类型的需要通用控制的方法。 – Kayle

+0

你能给出'Boolean'和'Byte'各自情况的例子吗?就目前来看,我甚至没有看到需要使这个方法成为通用的(而不是将'Type'作为常规参数传递)。如果这个方法并不是真的需要通用 - 而是仅仅被用作硬编码专用案例的调用点,那么不,这不是坏习惯,要做你正在做的事情(因为没有其他方法实现它)。但是,正如我所说的,方法体中的更多细节可以让您更容易地看到您的想法。 –

回答

1

你可以让你的代码一般像这样的东西:

var size = Marshal.SizeOf(typeof(T)); 
var subBuffer = new byte[size]; 
Array.Copy(Buff, Peek, subBuffer, 0, size); 
var handle = GCHandle.Alloc(subBuffer, GCHandleType.Pinned); 
var ptr = handle.ToIntPtr(); 
var val = (T)Marshal.PtrToStructure(ptr, typeof(T)); 
ptr.Free(); 
Peek += size; 
Peek = (Peek + (Align - 1)) & ~(Align - 1); 
return val; 

然而,如果这个性能问题,受到了你的使用情况,然后提供硬编码的专门版本,可能不是一个糟糕的方式这样做,因为没有任何明显的选择。