以下の答えは何年も前に書かれ、時間の経過とともに更新されました。C#7以降では、パターンマッチングを使用できます。
if (animal is Dog dog)
{
// Use dog here
}
注dog
後のスコープにまだあるif
声明、間違いなく割り当てられていません。
いいえ、ありません。これを書くのはもっと慣用的です:
Dog dog = animal as Dog;
if (dog != null)
{
// Use dog
}
ほとんどされた「場合によって以下のように」ということを考えると、常にこの方法を使用し一度に両方の部品を行うオペレータがあるために、それはより多くの意味を作るかもしれません。これは現在C#6にはありませんが、パターンマッチングの提案が実装されている場合、C#7の一部になる可能性があります。
問題は、変数の条件部分で変数を宣言できないことです。if
ステートメントの 1。私が考えることができる最も近いアプローチはこれです:
// 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
});
または、2つを組み合わせることができます。
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ループよりもクリーンな方法で、ラムダ式なしの拡張メソッドを使用することもできます。
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
状態はどうなりますか?