2012-10-12 22 views
1

在我最後一家公司,我遇到了創建用於某些分隔字符串或SQL表中列的索引的常量的一種非常聰明的方式,但是我一直在想如果有一個表現或其他缺陷,我沒有抓住。鏈接C#常量:

例如,如果是在一個單一的分隔字符串包含地址信息的五個數據字段,您可能會看到以下內容:

const int INDX_NAME = 0; 
const int INDX_ADDR = INDX_NAME + 1; 
const int INDX_CITY = INDX_ADDR + 1; 
const int INDX_STATE = INDX_CITY + 1; 
const int INDX_ZIP = INDX_STATE + 1; 

這樣一來,如果在未來,該程序需要分開有什麼事情可以在名稱和城市(比如,街道上一行的地址,在其他房號)之間的地址的兩條線,所有的程序員必須做的就是添加行

const int INDX_ADDR2 = INDX_ADDR + 1; 

和改線創建INDX_CITY至

const int INDX_CITY = INDX_ADDR2 + 1; 

總之,這似乎是一個非常聰明的處理列/片索引列表的方式,特別是如果列表是50+項目,並且您需要在索引號3處添加內容。但是,我不知道這個名單開始變大,或者是否有其他一些我沒有看到的固有缺陷,這會影響業績。

有什麼想法?有什麼讓這個懶惰的編程,而不是聰明?

謝謝。

CNC中

我能看到枚舉值將被賦予我已經得到的答覆,但我很擔心,如果我使用的每一個領域是他們只能將有用恰恰相距1個點。如果我使用其他程序員也參考的某些數據存儲片段,但我只關心全部字段的子集,那麼我需要跳過我不關心的字段塊。

例如,我使用長度爲300字段的分隔字符串中的100個數據字段,但我的應用程序不關心字段1-4(數組計數)。是否有一個乾淨的方式來使用枚舉代替

const int INDX_RECORD_ID = 0; 
const int INDX_DATE_UPDATED = INDX_RECORD_ID + 5; 
const int INDX_USER_UPDATED = INDX_DATE_UPDATE + 1; 
... 

+6

不應該是性能問題,因爲它們都是常量,因此是在編譯時計算的。 – pstrjds

+3

聽起來像它應該用枚舉代替。無論如何,常量是在編譯時進行評估的,所以唯一的性能影響是在最終在運行時稍後排序的方面。也似乎很容易出錯(例如,你說你只需要更新下面的一個,但是如果你忘記會發生什麼?) –

+0

我不會關心那種情況下的性能。對我來說似乎是一個非常聰明的解決方案。感謝分享。 –

回答

5

你應該真的在這裏使用enum。它們專爲這種類型的情況設計:

public enum MyEnum 
{ 
    NDX_NAME, 
    INDX_ADDR, 
    INDX_CITY, 
    INDX_STATE, 
    INDX_ZIP 
} 

添加值(任何位置)將相應地更新所有的索引。

使用枚舉將有幾個優點:(不是一個詳盡的列表)

  1. 你可以有一個參數的函數或類型的枚舉,而不是指數的變量。這有助於讓其他編碼人員更清楚地知道:「這個參數需要在這個其他類中的其中一個常量中給出。「
  2. 您不需要擔心在不添加前一個常量的情況下出錯,當您在中間添加新項目時,或者僅僅將複製/粘貼錯誤
  3. 您可以使用其他枚舉工具,例如獲取枚舉的字符串值(以及整數值)以更容易顯示的能力,您可以使用反射來迭代可能的值,您可以解析字符串或整數到相應的枚舉值等

至於性能,這些值(兩者枚舉和你的常量)將在編譯時進行評估,不是運行,所以在運行時,它贏得了」沒有任何額外的成本超過手動編號環。

+0

Servy在上面關於脫節的必要值的評論討論中提出了一個很好的觀點(即需要中斷的值,如0,4,5,7,8,9等) –