C #: 'è' parola chiave e verifica la presenza di Not
Domanda
Questa è una domanda stupida, ma puoi usare questo codice per verificare se qualcosa è un tipo particolare ...
if (child is IContainer) { //....
Esiste un modo più elegante per verificare la quot &; NOT " esempio?
if (!(child is IContainer)) { //A little ugly... silly, yes I know...
//these don't work :)
if (child !is IContainer) {
if (child isnt IContainer) {
if (child aint IContainer) {
if (child isnotafreaking IContainer) {
Sì, sì ... domanda stupida ....
Poiché esiste una domanda su come appare il codice, è solo un semplice ritorno all'inizio di un metodo.
public void Update(DocumentPart part) {
part.Update();
if (!(DocumentPart is IContainer)) { return; }
foreach(DocumentPart child in ((IContainer)part).Children) {
//...etc...
Soluzione
if(!(child is IContainer))
è l'unico operatore ad andare (non c'è IsNot
operatore).
Puoi creare un metodo di estensione che lo faccia:
public static bool IsA<T>(this object obj) {
return obj is T;
}
e poi usalo per:
if (!child.IsA<IContainer>())
E potresti seguire il tuo tema:
public static bool IsNotAFreaking<T>(this object obj) {
return !(obj is T);
}
if (child.IsNotAFreaking<IContainer>()) { // ...
Aggiornamento (considerando lo snippet di codice del PO):
Dal momento che stai effettivamente lanciando il valore in seguito, puoi semplicemente usare as
invece:
public void Update(DocumentPart part) {
part.Update();
IContainer containerPart = part as IContainer;
if(containerPart == null) return;
foreach(DocumentPart child in containerPart.Children) { // omit the cast.
//...etc...
Altri suggerimenti
Puoi farlo in questo modo:
object a = new StreamWriter("c:\\temp\\test.txt");
if (a is TextReader == false)
{
Console.WriteLine("failed");
}
Perché non usare semplicemente l'altro?
if (child is IContainer)
{
//
}
else
{
// Do what you want here
}
È pulito, familiare e semplice?
Il modo in cui lo hai va bene ma potresti creare una serie di metodi di estensione per rendere " un modo più elegante per verificare l'istanza 'NOT'. " ;
public static bool Is<T>(this object myObject)
{
return (myObject is T);
}
public static bool IsNot<T>(this object myObject)
{
return !(myObject is T);
}
Quindi potresti scrivere:
if (child.IsNot<IContainer>())
{
// child is not an IContainer
}
Ugly? Non sono d'accordo. L'unico altro modo (penso personalmente che sia & Quot; uglier & Quot;):
var obj = child as IContainer;
if(obj == null)
{
//child "aint" IContainer
}
L'operatore is
valuta un risultato booleano, quindi puoi fare tutto ciò che altrimenti potresti fare su un booleano. Per negarlo usa l'operatore !
. Perché vorresti avere un operatore diverso solo per questo?
Il metodo di estensione IsNot<T>
è un buon modo per estendere la sintassi. Tieni a mente
var container = child as IContainer;
if(container != null)
{
// do something w/ contianer
}
funziona meglio che fare qualcosa del genere
if(child is IContainer)
{
var container = child as IContainer;
// do something w/ container
}
Nel tuo caso, non importa come stai tornando dal metodo. In altre parole, fai attenzione a non eseguire sia il controllo del tipo che la conversione del tipo immediatamente dopo.
Sebbene l'operatore IS sia normalmente il modo migliore, esiste un'alternativa che è possibile utilizzare in alcune circostanze. Puoi usare l'operatore as e testare null.
MyClass mc = foo as MyClass;
if ( mc == null ) { }
else {}
Anche se questo non evita il problema delle parentesi, per il bene delle persone che arrivano qui tramite Google, va detto che esiste una sintassi più recente (a partire da C # 7) per rendere il resto del codice un po 'più pulito:
if (!(DocumentPart is IContainer container)) { return; }
foreach(DocumentPart child in container.Children) {
...
Ciò evita il doppio cast, il controllo null e la disponibilità di una variabile in ambiti in cui potrebbe essere null.
Questo non è stato ancora menzionato. Funziona e penso che abbia un aspetto migliore rispetto all'utilizzo di !(child is IContainer)
if (part is IContainer is false)
{
return;
}
if (child is IContainer ? false : true)