Laden...

Vereinfachung If Ausdruck

Erstellt von Nejox vor 2 Jahren Letzter Beitrag vor 2 Jahren 376 Views
N
Nejox Themenstarter:in
19 Beiträge seit 2016
vor 2 Jahren
Vereinfachung If Ausdruck

Hallo zusammen,

leider weis ich nicht wonach ich suchen sollte für mein Problem. Es geht um die vereinfachung von einem If Ausdruck und ob dies überhaupt möglich ist.

Ich habe mehrere Werte die ich auf null Prüfe.


if (a == null || b == null || c == null || d == null /*... und immer so weiter */)
{
  // mein code
}

Gibt es hier eine Schreibweise die mir das ganze etwas abkürzen kann?
Ich dachte da an so etwas wie folgendes.


if ((a || b || c  || d) == null)
{
  // mein code
}

Freue mich auf eine Antwort

T
2.219 Beiträge seit 2008
vor 2 Jahren

Kommt immer darauf an.
Wenn die Variablen vom selben Typ sind, kannst du diese ggf. auch an eine eigene Methode übergeben per params.
Dann gibt diese ein true/false zurück, wenn eine der Variablen null ist.
Dadurch sparst du dir die lange Kette.

Es wäre aber auch interessant zu wissen, warum du soviele Variablen mit null checken willst?
Wenn es der selbe Typ ist, dann pack diese in eine Liste/Array.

Nachtrag:
Durch die Liste hättest du am Ende auch den Vorteil, dass du nur prüfen musst ob es Einträge gibt.
Wenn nicht, kannst du die Verarbeitung auch verlassen.
Eingefügt werden sollten dann nur Einträge, die nicht Null sind.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

6.911 Beiträge seit 2009
vor 2 Jahren

Hallo Nejox,

Gibt es hier eine Schreibweise die mir das ganze etwas abkürzen kann?

Nein.
In C# muss das explizit für jeden "Test" angegeben werden. Für Möglichkeiten siehe T-Virus' Antwort.

Weil es irgendwie zum Thema passt:


static bool IsZero(int a, int b) => a == 0 || b == 0;

kann, da es Ganzzahlen sind, vereinfacht werden zu


static bool IsZero(int a, int b) => (a | b) == 0;

Das spart eine Verzweigung im Code und ist daher auch performanter. Leserlicher ist vermutlich nicht für alle, da Bit-Operationen vorkommen, daher gibt es in .NET 6 (Herbst 2021) eine Optimierung im JIT, welche aus dem ersten Code den zweiten macht.

Aber für Referenzen, wie in deiner Frage, geht das nicht.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

309 Beiträge seit 2020
vor 2 Jahren

Gelöscht - falsch verstanden, sorry.

16.806 Beiträge seit 2008
vor 2 Jahren

Nein, gibt es in der Reinheit, die Du hier vermutlich willst, nicht.

Ich hab die Erfahrung gemacht: hast Du eine Anforderung, dass eine Condition zu lang wird, dann stimmt meist was am Code Design selbst nicht.
Also ein Anzeichen, dass die Software Architektur fischig oder zumindest auf dem Weg dahin sein könnte 🙂

Was Du aber immer machen kannst sind einfache Extension Methods


public static class Check
{
    public static bool IsAnyNull(params object[] args) => args.Any(x => x is null);
}

und dann eben


int? a = null;
double? b = null;
string c = null;

if(Check.IsAnyNull(a, b, c))
{
    // do it
}

C
9 Beiträge seit 2012
vor 2 Jahren

Wenn du prüfen wolltest: "Sind alle null?" könntest Du den "null-coalescing operator" verwenden.


if ((a ?? b ?? c ?? d ?? e?? f) == null) {
...
}

Aber eben nur für alle nicht für einen.

Das ginge für: "Ist eines null?", aber etwas hässlich und erzeugt zudem unnötigen Speicherbedarf


if (new []{a,b,c,d,e,f}.Any( o => o == null)) {
...
}

N
Nejox Themenstarter:in
19 Beiträge seit 2016
vor 2 Jahren

Danke für die Antworten.
Das hilft mir weiter 🙂