2015-04-27 126 views
3

我正在寫一個簡單的C#類,它在特定的比賽中處理SQL查詢。大部分的查詢將SELECT語句應正確轉義3-4參數,所以該函數將是這樣的C#函數參數數組與列表

public DataTable Select(string query, string[] parameters) { 
    # some code 
} 

應該parametersArrayList<>?在這兩種類型之間作爲函數參數進行選擇時,是否有一些最佳做法,還是僅僅是偏好問題?

P.S.由於具有靈活性,我通常更喜歡List<>,但這裏可以在飛行中創建Array是一個很好的觀點。

+0

如果對參數有任何操作,我會用List來調整數組的大小。如果不需要調整大小,我會堅持一個數組。 –

+0

而不是「轉義」參數使用SQL參數。 –

+0

我的建議:不要寫這種通用數據訪問的東西。這是浪費時間。 etiher使數據庫特定的存儲庫,它返回您的對象或使用system.data通用數據的東西 – Ewan

回答

10

你應該使用IEnumerable的,那麼它可以是因爲這兩個listarray實現這個

public DataTable Select(string query, IEnumerable<string> parameters) 

他們也都實現IListICollection,它可以提供其他有用的特性在評論中所示添Schmelter

+4

IEnumerable 你的意思 –

+0

嗯,可能它取決於哪些OP想要限制到,可能'IEnumerable '也是,謝謝 – Sayse

+1

如果他只想包含上面提到的數組或列表,他應該使用'IList '。然後你仍然可以通過索引訪問它們而不需要轉換並使用Count屬性(是的,數組有)。 –

3

按照Robustness principle, or Postel's law(重點煤礦):

是你做什麼保守,是Liberal你從別人

換句話說接受,使用「廣泛的」類型可能,一個上漲的繼承層次,從而爲:

  1. 需求儘可能少地從用戶,
  2. ,給用戶儘可能多的選擇成爲可能。

在這種情況下:

  • 如果所有你需要做的是通過參數的集合迭代,那麼你應該從用戶要求可以重複一個類型的實例:其中,在這種情況下,是IEnumerable<T>
  • 如果您需要添加/刪除項目,然後ICollection<T>將是最自由的選擇
  • 如果由於某種原因,你需要通過索引來訪問項目,那麼你應該要求一個IList<T>
0

一般來說,如果您只從序列中讀取,我會使用IEnumerable<T>

在這個特定背景下,但是我會簡單地使用params string[]甚至params object[]類型,因爲那麼你可以使用它像String.Format,即

var dt = Select("select A from Table where X=? and Y=?", value1, value2); 
0

如果你的參數都相同類型的(這裏的字符串)你可以在字符串數組中使用params關鍵字。

public DataTable Select(string query, params string[] parameters) 

因此,你可以這樣調用它下面

Select(myQuery, param1, param2, ...); 
1

就個人而言,我希望至少一個超載授予我傳遞一個參數數組的能力:

public DataTable Select(string query, params string[] parameters); 

那倒請允許我用這樣的參數調用它:

Select("SELECT FROM WHERE", "3", "17", "Joe"); 

任何具有IEnumerable<>可以在通過它輕鬆,太:

Select("SELECT FROM WHERE", myData.ToArray()); 

更好的將是一個過載是爲了我自己。

2

在什麼nvoig所述頂部,我會:

public DataTable Select(string query, params string[] parameters) 
{ 
    return Select(query, (IEnumerable<string>)parameters); 
} 

public DataTable Select(string query, IEnumerable<string> parameters) 
{ 
    return null; 
} 

,這樣,如果你有一個「靜態」查詢,您可以使用第一個重載(因爲你知道在編譯時的參數的數量) ,而如果你有一個「動態」查詢,你可以使用第二個超載與string[]List<string>或LINQ表達式的結果。