Pobiegłem na wyjątek referencyjny z Null na linii:

dr["IsSandpit"] = p.MineralName.Equals("Sand");

Oczywiście poprawka jest:

dr["IsSandpit"] = p.MineralName!=null && p.MineralName.Equals("Sand");

Ale zastanawiam się, czy zróżnicowany typ można skonfigurować, że metoda równa zamiast rzucania wyjątkiem referencyjnym NULL właśnie powróciłby false dla silnie wpisanej zmiennej? Lub jakaś metoda NotNullAndEquals?

NULL w bazie danych oznacza coś takiego jak "nie wypełnione" lub puste i "puste" z pewnością nie jest równe "piasku". (Być może jest to duplikat, ale nie znalazłem właściwego pytania)

3
Vojtěch Dohnal 19 luty 2018, 12:35

3 odpowiedzi

Najlepsza odpowiedź

Możesz wywołać metodę statyczną {x0}} na obu operandach:

var isEqual =  string.Equals("Sand", p.MineralName); // return false for null.

Spowoduje to usunięcie konieczności dostępu do potencjalnie zerowego odniesienia. Alternatywnie można użyć operatora propagacji Null, aby uniknąć operacji, jeśli wartość jest null:

var isEqual = p.MineralName?.Equals("Sand"); // return null for null.

Są to znacznie lepsze podejścia, IMO, niż przy użyciu metod rozszerzeń, aby złączyć metodę, która może być teoretycznie wywoływana w odniesieniu do NULL, ponieważ podejście prowadzi do zamieszania, czy można bezpiecznie zadzwonić do metody bez sprawdzania null. Wyobraź sobie ten kod:

 if (!p.MineralName.Equals("Sand"))
 {  
       return p.MineralName.ToUpper(); // throws NullReferencException!
 }
5
Avner Shahar-Kashtan 19 luty 2018, 11:02

Ekspresja

p.MineralName?.Equals("Sand")

Ocenisz do null jeśli p.MineralName jest null. Następnie możesz go zwiększać do fałszywego, jak:

p.MineralName?.Equals("Sand") ?? false
0
John Wu 19 luty 2018, 09:50

Jako opcja można wykorzystać samodzielnie utworzoną metodę rozszerzenia :

    public static class Utilities {
        public static bool NotNullAndEquals(this string value, string expected) {
            return value != null && value.Equals(expected);
        }
    }
-1
serge.karalenka 19 luty 2018, 09:52