下面的答案是几年前写的,并且随着时间的推移而更新。从C#7开始,您可以使用模式匹配:
if (animal is Dog dog)
{
// Use dog here
}
请注意,dog
该if
语句之后仍在范围内,但未明确分配。
不,没有。虽然这样写更惯用:
Dog dog = animal as Dog;
if (dog != null)
{
// Use dog
}
鉴于“ as if后面的”几乎总是以此方式使用,因此可能需要一个操作员一次性执行两个部分的操作。如果实施了模式匹配建议,则C#6中当前不存在此功能,但C#7中可能包含此功能。
问题是您不能在语句1的条件部分中声明变量。我能想到的最接近的方法是:if
// EVIL EVIL EVIL. DO NOT USE.
for (Dog dog = animal as Dog; dog != null; dog = null)
{
...
}
那太讨厌了 ……(我已经尝试过了,它确实起作用了。但是请,请不要这样做。哦,您当然可以声明dog
使用var
。)
当然,您可以编写一个扩展方法:
public static void AsIf<T>(this object value, Action<T> action) where T : class
{
T t = value as T;
if (t != null)
{
action(t);
}
}
然后调用:
animal.AsIf<Dog>(dog => {
// Use dog in here
});
另外,您可以将两者结合起来:
public static void AsIf<T>(this object value, Action<T> action) where T : class
{
// EVIL EVIL EVIL
for (var t = value as T; t != null; t = null)
{
action(t);
}
}
与for循环相比,您还可以使用没有lambda表达式的扩展方法:
public static IEnumerable<T> AsOrEmpty(this object value)
{
T t = value as T;
if (t != null)
{
yield return t;
}
}
然后:
foreach (Dog dog in animal.AsOrEmpty<Dog>())
{
// use dog
}
1您可以在语句中分配值if
,尽管我很少这样做。但是,这与声明变量不同。这不是非常不寻常的,我做在while
读取数据流时,虽然。例如:
string line;
while ((line = reader.ReadLine()) != null)
{
...
}
如今,我通常更喜欢使用可以使用的包装器,foreach (string line in ...)
但我将以上内容视为一种惯用的模式。这通常不是很好,有一个条件中的副作用,但替代品通常涉及重复代码,当你知道这种模式很容易得到的权利。
bool
情况?