以下示例很糟糕,因为它有代码重复。例如,如果我们以后需要在喝酒之前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