2009-02-05 247 views
1

難道還有比聲明枚舉作爲枚舉和常量

public enum DepthNumberSize 
{ 
    Bit1 = 1, 
    Bit4 = 4, 
    Bit8 = 8, 
    Bit16 = 16, 
    Bit32 = 32 
} 

,每時的相關數據塊進行開關操作語句中使用,如時間更好的辦法:

switch(size) 
{ 
    case DepthNumberSize.Bit1: 
     buffer[i++] = input[j] & 1; 
     buffer[i++] = (input[j] >> 1) & 1; 
     // cut 
    case DepthNumberSize.Bit8: 
     buffer[i++] = input[j++]; 
     break; 
    case DepthNumberSize.Bit16: 
     buffer[i++] = input[j] | (input[j] << 8); 
     j += 2; 
     break; 
    // cut 
} 

謝謝。

+0

這是什麼枚舉acheiving?爲什麼不直接寫16而不是DepthNumberSize.Bit16? – 2009-02-05 23:44:20

+0

枚舉正在阻止使用幻數。 「1」表示一個,「Bit1」表示「第一位」。這有一點。 – 2009-02-05 23:52:01

回答

1

你可以做這樣的事情:

interface IBitSize 
    { 
     object DoStuff(); 
    } 

    class Bit1 : IBitSize 
    { 
     public object DoStuff() 
     { 
      buffer[i++] = input[j] & 1; 
      buffer[i++] = (input[j] >> 1) & 1; 
      return something. 
     } 
    } 

    class Bit2 : IBitSize 
    { 
     public object DoStuff() 
     { 
      //Do different stuff here. 
     } 
    } 

然後,你可以這樣調用:

IBitSize size = new Bit1(); 
    size.DoStuff(); 

這樣你可以刪除開關。

0

我想你可能需要澄清一些你的問題。

但是,您可以通過將其轉換爲一個字節(默認枚舉類型)來獲取枚舉的基礎值。

(byte)DepthNumberSize.Bit8 

將返回8,因爲你實際上可以利用你給你的枚舉的自定義值會更好(它們默認爲0,1,2,等等)。它甚至可以讓你擺脫整個switch語句,允許你編寫一個通用的代碼塊,使用枚舉變量'size'的基礎值來產生所需的結果。

1

您可以考慮使用類,可能使用工廠方法來返回大小的正確具體類型,例如,

abstract class BitManipulator 
{ 
    public abstract void Manipulate(
     byte[] buffer, byte[] input, ref int i, ref int j); 

    public static BitManipulator Create(int size) 
    { 
     switch (size) 
     { 
      case 1: return new Bit1Manipulator(); 
      case 2: return new Bit2Manipulator(); 
      // etc. 
     } 
    } 
} 

class Bit1Manipulator : BitManipulator 
{ 
    public override void Manipulate(
     byte[] buffer, byte[] input, ref int i, ref int j) 
    { 
     buffer[i++] = input[j] & 1; 
     buffer[i++] = (input[j] >> 1) & 1; 
    } 
} 

// etc. for other classes 

你則只是得到了一個開關語句,然後所有的邏輯可以包含在特定尺寸類,而不是通過在代碼的其餘部分switch語句充斥。當然,您可以爲每種需要做的事情提供多種方法。

很難說這是否適合您的應用程序,因爲沒有很多上下文,但這是另一種可用於此類情況的方法。這一般範式

0

工作,是:

Bit1 = 0x00000001, 
    Bit2 = 0x00000002, 
    Bit3 = 0x00000004, 
    Bit4 = 0x00000008, 
    Bit5 = 0x00000010 
0

取決於需要什麼,真的。如果實際上需要滿足任意數量的比特,那麼最好有一個循環將來自源的數據一個接一個地進行比較,組裝該值,然後在讀取了正確的比特數後將其寫入目的地。但是,如果真的只有一組固定的寬度,那麼開關和外殼就沒問題了(對我而言,無論如何),因爲它可能更清楚發生了什麼。使代碼比需要的更通用是沒有意義的。

在任何一種情況下,將所有這些隱藏在函數或其他抽象方法後面可能會更好,以便它可以更容易地重用(「每一次」都表明這一小部分代碼作物在幾個地方),而決定的結果只寫在一個地方。如果使用枚舉來表示一些固定的位數,每個枚舉應該有一個任意值,而不是相應的位數,這更好地表明這個名字不在任何位置絕不意味着任意比特數,相反卻是一個簡單的標記表示支持的比特數之一)。

(也讀16位時,其中一個字節也許應該來自input[j+1]。)