以下示例很糟糕,因爲它有代碼重複。例如,如果我們以後需要在喝酒之前CheckExpirationDate
,我們需要在多個地方添加函數調用。如果我們需要將charley
和stan
添加到派對上,代碼會變得很快。處理一系列相同類型的命名變量
if (john != designatedDriver)
{
beer.Open();
john.Drink(beer);
}
if (bob != designatedDriver)
{
cider.Open();
bob.Drink(cider);
}
解決方案可能是構建這些對象的數組。如果您需要一次操作一個對象,這非常簡單。例如,如果每個人都在身邊掠過的啤酒單瓶:
beer.Open();
foreach (Dude i in new Dude[] { john, bob })
{
i.Drink(beer);
}
要改寫原來的例子,我們可以使用一個KeyValuePair
。不是特別漂亮,但是對於兩個以上的男士或者如果飲用程序足夠長(品酒),這是非常值得的。
foreach (KeyValuePair<Dude, Booze> i in KeyValuePair<Dude, Booze>[] {
new KeyValuePair<Dude, Booze>(john, beer),
new KeyValuePair<Dude, Booze>(bob, cider) })
{
if (i.Key != designatedDriver)
{
i.Value.Open();
i.Key.Drink(i.Value);
}
}
但是,如果我們一次需要操作三個或更多的對象呢?例如,約翰飲料啤酒和吃玉米片。我們可以求助於聲明自定義類型,但這會使得代碼依賴於遠處的其他代碼。我們可以將每種類型放在它自己的數組中,並執行一個好的舊的for
循環並訪問帶索引的對象,但這意味着要創建命名數組(Dude[] dudes = new Dude { john, bob };
)。
我在問的是是否有一些奇特的C#技巧可以讓我乾淨而緊湊地做到這一點?匿名類型?什麼東西?
您的第一個和第三個代碼示例並不相同,正如您所說的那樣。在第三個樣品中,鮑勃從不喝他的蘋果酒...... – LBushkin 2009-07-08 13:17:40
請詳細說明。 – CannibalSmith 2009-07-10 12:09:04