2011-11-28 13 views
9

Zakładając cały nowy kod .NET 4.0Czy powinienem włączyć sprawdzanie kodu źródłowego dla .NET 4.0 w kompilacjach wersji?

Widzę, że istnieje opcja ich włączenia. Jednak nie widzę, jaka jest najlepsza praktyka?

Czy po sprawdzeniu statycznym najlepsza praktyka nie wymaga sprawdzania w czasie wykonywania (skoro kompilator upewnia się, że warunki są spełnione)? A może istnieją scenariusze, w których mimo tego, że kompilator sprawdza to za Ciebie, nadal możliwe jest, że w czasie działania warunek nie zostanie spełniony?

Wszelkie dobre dyskusje online lub artykuły na ten temat. Widzę wielu, którzy wyjaśniają, jak to zrobić, ale niewielu wyjaśnia, która z nich jest najlepszą praktyką przy założeniu, że potrzebny jest cały nowy kod .NET 4.0 bez potrzeby kompatybilności wstecznej.

Odpowiedz

5

ponieważ kompilator upewnia się, że warunki są spełnione?

To będzie bardzo rzadki, że statyczny weryfikator będzie mógł zweryfikować całą aplikację. Zwykle osiedlamy się w głównych częściach.

Czy powinienem włączyć sprawdzanie kodu źródłowego dla .NET 4.0 w wersjach uruchomieniowych?

Prawdopodobnie nie Pełny opcja , ale jednym z lżejszymi jak wstępnych Tylko.

Aby uzyskać kod o istotnym znaczeniu dla wydajności, możesz wyłączyć go całkowicie.

4

To zależy od sposobu użycia Wymaga. Tryb

Jeśli używasz „Niestandardowe Zamówienie Wymaga”:

public void SomeMethod(SomeClass x) 
{ 
    if (x == null) throw new ArgumentNullException("x"); 
    Contract.EndContractBlock(); 

    ... 
} 

można bezpiecznie włączyć run-time sprawdza się, a zachować kontrolę błędów i wyjątków

Jeśli używasz „Umowa standard wymaga” tryb:

public void SomeMethod(SomeClass x) 
{ 
    Contract.Requires<ArgumentNullException>(x != null); 

    ... 
} 

powinieneś przekonwertować kontrole czasu pracy na co najmniej poziom "ReleaseRequires". W przeciwnym razie będziesz tracić kontrole błędach i może uzyskać nieoczekiwane wyjątki (np NullReferenceException gdzieś głęboko w kodzie zamiast ArgumentNullException na powierzchni publicznych)

Nie użyłbym wyższy poziom sprawdzania dla bardzo prostego powodu: jeśli dowolny Zlecenie inne niż Contract.Requires<E> nie powiedzie się, środowisko wykonawcze rzuci System.Diagnostics.ContractException, co prawdopodobnie nie będzie zadowolić użytkowników.

BTW, Henk Holterman ma absolutną rację, że weryfikator statyczny jest ograniczony i nie należy polegać na nim całkowicie.

Powiązane problemy