La réponse ci-dessous a été écrite il y a des années et mise à jour au fil du temps. À partir de C # 7, vous pouvez utiliser la correspondance de modèles:
if (animal is Dog dog)
{
// Use dog here
}
Notez que cela dog
est toujours dans la portée après l' if
instruction, mais n'est pas définitivement attribué.
Non, il n'y en a pas. Il est cependant plus idiomatique d'écrire ceci:
Dog dog = animal as Dog;
if (dog != null)
{
// Use dog
}
Etant donné que "comme suivi de si" est presque toujours utilisé de cette façon, il pourrait être plus logique qu'il y ait un opérateur qui exécute les deux parties en une seule fois. Ce n'est pas actuellement en C # 6, mais peut faire partie de C # 7, si la proposition de correspondance de modèle est implémentée.
Le problème est que vous ne pouvez pas déclarer une variable dans la partie condition d'une if
instruction 1 . L'approche la plus proche à laquelle je puisse penser est la suivante:
// EVIL EVIL EVIL. DO NOT USE.
for (Dog dog = animal as Dog; dog != null; dog = null)
{
...
}
C'est juste méchant ... (Je viens de l'essayer, et ça marche. Mais s'il vous plaît, ne faites pas ça. Oh, et vous pouvez déclarer dog
utiliser var
bien sûr.)
Bien sûr, vous pouvez écrire une méthode d'extension:
public static void AsIf<T>(this object value, Action<T> action) where T : class
{
T t = value as T;
if (t != null)
{
action(t);
}
}
Alors appelez-le avec:
animal.AsIf<Dog>(dog => {
// Use dog in here
});
Vous pouvez également combiner les deux:
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);
}
}
Vous pouvez également utiliser une méthode d'extension sans expression lambda d'une manière plus propre que la boucle for:
public static IEnumerable<T> AsOrEmpty(this object value)
{
T t = value as T;
if (t != null)
{
yield return t;
}
}
Ensuite:
foreach (Dog dog in animal.AsOrEmpty<Dog>())
{
// use dog
}
1 Vous pouvez attribuer des valeurs dans les if
instructions, bien que je le fasse rarement. Ce n'est pas la même chose que de déclarer des variables. Il n'est pas terriblement inhabituel pour moi de le faire dans un while
moment lors de la lecture de flux de données. Par exemple:
string line;
while ((line = reader.ReadLine()) != null)
{
...
}
Ces jours-ci, je préfère normalement utiliser un wrapper qui me permet d'utiliser, foreach (string line in ...)
mais je considère ce qui précède comme un modèle assez idiomatique. Il n'est généralement pas agréable d'avoir des effets secondaires dans une condition, mais les alternatives impliquent généralement la duplication de code, et lorsque vous connaissez ce modèle, il est facile de bien faire.
bool
condition?