-7

Ich habe diese bedingtenGibt der bedingte Operator null den Wert false zurück, wenn null?

if (item?.Value2?.GetType() != typeof(string) && item.get_Value() == 0)

Ich glaube, dass, wenn das Element der Null ist ?. Betrieb null zurück, die ich als false wird aufgelöst glauben, den Zustand zu Kurzschluss verursachen und alles wird gut (item.get_Value() wird nicht genannt)

werden aber ich nicht sicher bin, dachte ich, vielleicht ist es wie ich tun muss so

if (item?.Value2?.GetType() ?? 0 != typeof(string) && item.get_Value() == 0)

aber ich denke, das könnte Overkill sein, ist der erste Weg sicher vor möglichen Null Referenz Ausnahme?

+8

Es gibt keine Notwendigkeit für „Glauben“ in der Programmierung . Sie können den Compiler immer starten und testen. –

+0

ist Artikel eine einzelne Zelle Excel-Bereich? Möchten Sie überprüfen, ob der Zellenwert 0 ist oder ob der angezeigte formatierte Text "0" ist? Es ist übertrieben und es fehlen viele Randfälle. – Slai

+4

Warum nicht einfach 1. [Lesen Sie die Dokumentation] (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators) und/oder 2. Probieren Sie es aus und seht selbst? –

Antwort

5

item?.Value2?.GetType() kehrt null wenn item ist null oder Value2null ist.

Der Zustand wird

if (null != typeof(string) && item.get_Value() == 0) 

so die erste Bedingung verursacht ein als true gelöst werden ausgewertet NullReferenceException wenn item.get_Value() == 0 wird ausgeführt (aber nur, wenn item ist null und nicht Value2)

+0

@RufusL 'null! = Typeof (string)' wird zu 'true' ausgewertet – Alberto

+0

@hellyale hängt davon ab, was ist der Rückgabewert von' get_Value() '? – Alberto

+0

@hellyale ja, wenn 'item'' null' ist, dann 'item? .get_value()' wird 'null' zurückgeben und der Ausdruck' item? .get_Value() == 0' wird zu 'false' ausgewertet – Alberto

1

.Value2 ist schneller, aber für Zellen, die als Datum oder Währung formatiert sind, gibt .Value2 Double, aber .Value oder .get_Value() return DateTim zurück e und Dezimal. Beides ergibt Double, wenn die Zelle ein numerischer Typ ist, und String, wenn der Wert kein numerischer Typ oder eine numerierte Zahl ist, die als Text formatiert ist. Der Rückgabetyp kann auch Boolean für TRUE und FALSE und Integer für Fehler sein.


if (0.0.Equals(item.Value2)) // if (item.Value2 is Double && (Double)(item.Value2) == 0.0) 

Dies mag seltsam aussehen, aber es ist die kürzeste und sicherste Weg, wenn die Laufzeit type is Double and equal-,0 zu überprüfen. (Artikel ist nicht null, wenn es das Ergebnis Aufzählen einen Range ist)


Was das eigentliche Problem, die erste 0-Zelle zu finden:

Range cell = range.Find(0, LookAt: XlLookAt.xlWhole); 
if (cell != null) { /* ... */ } 
Verwandte Themen