2009-10-11 16 views
19

Nigdy nie użyłem typów zerowujących w moim kodzie C#. Teraz postanowiłem zmienić moją praktykę kodowania poprzez wprowadzenie typów nullable w moim kodzie.Praktyki kodowania dla C# Nullable typu

Jakie są najważniejsze zmiany w praktykach kodowania podczas dokonywania przejścia z normalnych typów danych do typów danych zerowych w przypadku programowania aplikacji?

Na jakie obszary należy się zatroszczyć?

Na jakie punkty powinienem zawsze zwracać uwagę?

Odpowiedz

11

Nullable<T> jest przydatny, gdy potrzebny jest niepoprawny stan dla typu wartości lub dane są pobierane z bazy danych, która może zawierać wartość dla kolumny w postaci . Jest to bardzo częste w niektórych starych kodach FORTRAN, które przenoszę do C#, aby niepoprawne wartości były ujemne lub 0, ale jest to kłopotliwe, szczególnie gdy wartości są używane w funkcjach matematycznych. Znacznie bardziej jawne jest użycie Nullable<T>, aby pokazać, że możliwy jest nieprawidłowy stan.

Warto wspomnieć, że po to samo:

Nullable<int> myNullableInt; 
int? myNullableInt; 
+10

Wskazówki: Nie zapominaj, wartość pusta z bazy danych jest reprezentowana jako DBNull.Value przez ADO.NET. Upewnij się, że używasz DBNull.Value do komunikacji z bazą danych zamiast wartości zerowej wartości Nullable . –

18

Nie należy używać typów nullable, ponieważ są to "nowe, fajne rzeczy", które odkryłeś. Używaj ich tam, gdzie są one odpowiednie i naprawdę przydatne.

Są narzuty na ich używanie, a jeśli zostaną użyte niepoprawnie, niepotrzebnie zwiększą złożoność kodu.

Należy również zachować ostrożność, aby uniknąć dereferencji zerowych, dlatego stanowią one dodatkowe obciążenie dla programistów pracujących z tym kodem. (W niektórych przypadkach jest to lepsze rozwiązanie niż koszt obejścia!)

+0

To nigdy nie jest dobry pomysł. Bo nikt nie wie, jakie zmiany nadchodzą w środowisku .net i może być tak, że zmiana jest całkowicie oparta na typach zerowych. – anonymous

+5

@JMSA: Nie rozumiem, co próbujesz powiedzieć. –

+1

+1. Typy nullable są niezwykle przydatne, gdy ich potrzebujesz, ale Jason ma rację, unikając obciążających rozmówców z koniecznością sprawdzania wartości vs. wartości zerowej przez cały czas. Rozważ wyrzucenie wyjątku, jeśli wartość null jest niepoprawna. – TrueWill

1

Rzadko używam typów zerowalnych. Jedyne miejsce, w którym ich używam, to kiedy mam do czynienia z typami zerowymi w bazie danych.

5

kilka innych dobrych pomysłów na użyciu zerowalne typów:

  • Nie zapomnij o elastyczność w składni. Nullable<int> jest taki sam, jak int?
  • Sprawdź, czy nie ma wartości NULL (var.HasValue) i rzuć go na typ bazowy, zanim użyjesz go jako typu bazowego.
+0

"rzuć go do typu bazowego, zanim użyjesz go jako typu bazowego." - Nie podążam za tym, co masz na myśli tutaj ... Jeśli chcesz mieć wartość, po prostu użyj "var.Value", lub nawet "var", jeśli już sprawdziłeś, ma wartość. – nicodemus13

+0

Och, podążam za tym, co masz na myśli; masz na myśli przypisanie jej do nowej zmiennej typu bazowego? – nicodemus13

+0

Tak. To znaczy. zawsze sprawdzaj, czy Twój Nullable ma wartość, zanim umieści tę wartość w int. – LJM

2

Wydają się odpowiednie dla wartości początkowej niektórych zmiennych typu wartości.

int? lastCodeReceived; 

if (lastCodeReceived.HasValue) 
{ 
    // At least one code has been received. 
} 
8

Ponadto uważam następującą właściwość przydatne:

public bool? IsHappy { get; set; } 

To pozwala mi mieć Tri-State wartość logiczną: tak, nie, nie odpowiedział.