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;
...
}
}
這似乎是實現無參數方法重載形式的唯一方法。這被認爲是不好的做法?
無論是好還是壞的做法通常都是非常有關聯的。你能否提供一些你想要達到的細節? –
好點。我正在爲網絡系統編寫一個緩衝區類。我需要幾種類型的讀/寫方法。然而這對於讀取方法來說並不容易,因爲它們不能被重載。這迫使我要麼使用泛型類型檢查,要麼使用多個個性化方法 - 從設計的角度來看,這也很糟糕。但是,您可以將此應用於大多數情況下,您只需要一種多功能類型的需要通用控制的方法。 – Kayle
你能給出'Boolean'和'Byte'各自情況的例子嗎?就目前來看,我甚至沒有看到需要使這個方法成爲通用的(而不是將'Type'作爲常規參數傳遞)。如果這個方法並不是真的需要通用 - 而是僅僅被用作硬編碼專用案例的調用點,那麼不,這不是壞習慣,要做你正在做的事情(因爲沒有其他方法實現它)。但是,正如我所說的,方法體中的更多細節可以讓您更容易地看到您的想法。 –