Generalnie ostrzeżenia kompilatora służą wskazaniu potencjalnie niebezpiecznych miejsc w naszym kodzie. Dość powszechny jest także pogląd (moim zdaniem – słuszny) nakazujący traktować ostrzeżenia na równi z błędami. Visual Studio umożliwa nam takie postępowanie poprzez opcję “Treat warnings as errors” (we właściwościach projektu, zakładka Build):
Jej domyślna wartość to None, zachęcam jednak do zmiany tego ustawienia.
Co natomiast w przypadku, gdy ostrzeżenie jest nam znane i z całą odpowiedzialnością je akceptujemy? Jak zmusić kompilator do jego ignorowania?
Oczywiście mamy taką możliwość. A nawet dwie…
Spójrzmy na kod:
1: // CS0169 – The field ‘WindowsFormsApplication1.Form1.unusedVariable’ is never used
2: int unusedVariable;
3:
4: // CS3008 – Identifier ‘WindowsFormsApplication1.Form1._nonCLSCompliant’ is not CLS-compliant
5: protected int _nonCLSCompliant;
W komentarzach umieściłem treść ostrzeżeń z okienka “Errors”. Numer ostrzeżenia można znaleźć w internecie, bądź klikając prawym przyciskiem myszy na danym ostrzeżeniu i wybraniu z menu kontekstowego opcji “Show Error Help”.
Oto jak można pozbyć się upomnień kompilatora:
– w skali całego projektu
Bardzo proste, ponownie skorzystamy z zakładki Build w oknie właściwości projektu:
I mamy spokój.
– tylko w wyznaczonym fragmencie kodu
Czasami jednak takie generalizowanie nie jest najelpszym rozwiązaniem. Wówczas możemy uciec się do mniej chyba znanej funkcjonalności, a mianowicie dyrektywy preprocesora.
W praktyce wygląda to tak:
1: #pragma warning disable 0169, 3008
2:
3: // CS0169 – The field ‘WindowsFormsApplication1.Form1.unusedVariable’ is never used
4: int unusedVariable;
5:
6: // CS3008 – Identifier ‘WindowsFormsApplication1.Form1._nonCLSCompliant’ is not CLS-compliant
7: protected int _nonCLSCompliant;
8:
9: #pragma warning restore 0169, 3008
Tym sposobem osiągamy ignorowanie tylko wyznaczonych ostrzeżeń – tylko w wyznaczonym obrębie kodu.
“Ignorance is bliss” :)
Przydałyby się jakieś konkretne przykłady kiedy ignorowanie wyjątków "jest błogosławieństwem"
W jednym z projektów jedno assembly miało ustawiony atrybtut CLSCompliant. Nie mogłem tego zmienić, miałem jednak pewność że moja klasa w "procederze bycia kompatybilnym" nie bierze udziału (tak naprawdę ten atrybut w ogóle nie był potrzebny). Tak więc przykład z powyższego posta pochodzi właśnie z tamtej sytuacji, gdy deklarację moich zmiennych otoczyłem #pragmami.