Mam plik HTTPSystemDefinitions.cs w projekcie C #, który zasadniczo opisuje starszy interfejs ISAPI systemu Windows do wykorzystania przez kod zarządzany.
Obejmuje to pełny zestaw struktur związanych z ISAPI, które nie są wszystkie lub które są wykorzystywane przez kod. Podczas kompilacji wszyscy członkowie pola tych struktur powodują ostrzeżenie podobne do następującego: -
Pole ostrzeżenia „UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.SetHeader” nigdy nie jest przypisane do i zawsze będzie miało swoją domyślną wartość null
lub
Ostrzeżenie Pole „UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.HttpStatus” nigdy nie jest używane
Czy można je wyłączyć za pomocą #pragma warning disable
? Jeśli tak, jakie byłyby odpowiednie numery błędów? Jeśli nie, to czy mogę coś jeszcze zrobić? Pamiętaj, że ja tylko robię to dla tego pliku, ważne jest, żebym zobaczył ostrzeżenia takie jak te pochodzące z innych plików.
Edytować
Przykładowa struktura: -
struct HTTP_FILTER_PREPROC_HEADERS
{
//
// For SF_NOTIFY_PREPROC_HEADERS, retrieves the specified header value.
// Header names should include the trailing ':'. The special values
// 'method', 'url' and 'version' can be used to retrieve the individual
// portions of the request line
//
internal GetHeaderDelegate GetHeader;
internal SetHeaderDelegate SetHeader;
internal AddHeaderDelegate AddHeader;
UInt32 HttpStatus; // New in 4.0, status for SEND_RESPONSE
UInt32 dwReserved; // New in 4.0
}
źródło
[StructLayout(LayoutKind.Sequential)]
należy się upewnić, że układ pamięci jest poprawny (w obecnej implementacji będzie nawet bez tego atrybutu, ale AFAIK nie jest to gwarantowane). Jeśli dobrze pamiętam, kompilator C # wykrywa obecność tego atrybutu i automatycznie pomija te ostrzeżenia, ponieważ wie, że pola muszą być dostępne dla międzyoperacyjnej. (Mogę się mylić, dlatego piszę jako komentarz zamiast odpowiedzi).StructLayout
. Wydaje się to czystsze niż tłumienie samych ostrzeżeń.Odpowiedzi:
Tak, można je stłumić.
Zwykle sprzeciwiam się wygaszaniu ostrzeżeń, ale w tym przypadku struktury używane do interopu bezwzględnie wymagają obecności niektórych pól, nawet jeśli nigdy nie zamierzasz (lub nie możesz) ich używać, więc w tym przypadku myślę, że powinno to być uzasadnione .
Zwykle, aby usunąć te dwa ostrzeżenia, naprawiłbyś niewłaściwy kod. Pierwszy („… nigdy nie jest używany”) to zwykle zapach kodu pozostałości po wcześniejszych wersjach kodu. Być może kod został usunięty, ale pola pozostawione.
Drugi to zwykle zapach kodu dla nieprawidłowo używanych pól. Na przykład możesz niepoprawnie zapisać nową wartość właściwości z powrotem do samej właściwości, nigdy nie zapisując w polu zapasowym.
Aby wyłączyć ostrzeżenia „ Pole XYZ nigdy nie jest używane ”, wykonaj następujące czynności:
Aby pominąć ostrzeżenia dla „ Pola XYZ nigdy nie jest przypisane i zawsze będzie miało swoją domyślną wartość XX ”, wykonaj następujące czynności:
Aby samodzielnie znaleźć takie numery ostrzeżeń (tj. Skąd wiedziałem, że mam używać 0169 i 0649), wykonaj następujące czynności:
Skopiuj 4-cyfrowy kod ostrzegawczy z odpowiedniej wiadomości, który powinien wyglądać tak:
Uwaga : zgodnie z komentarzem @Jon Hanny , być może kilka ostrzeżeń jest na to potrzebne, dla przyszłych użytkowników tego pytania i odpowiedzi.
#pragma warning disable XYZK
wyłącza ostrzeżenie dla pozostałej części tego pliku lub przynajmniej do czasu#pragma warning restore XYZK
znalezienia odpowiedniego. Zminimalizuj liczbę wierszy, w których wyłączasz te ostrzeżenia. Powyższy wzór wyłącza ostrzeżenie tylko dla jednej linii.źródło
//exists for interop
w ta sprawa.[StructLayout(LayoutKind.Sequential)]
atrybutu znacznie lepiej współdziała, zgodnie z komentarzem Grega Beecha do pytania.Innym „rozwiązaniem” naprawienia tych ostrzeżeń jest utworzenie struktury
public
. Ostrzeżenia nie są wtedy generowane, ponieważ kompilator nie może wiedzieć, czy pola są używane (przypisywane) poza zestawem.To powiedziawszy, komponenty „interop” zwykle nie powinny być publiczne, ale raczej
internal
lubprivate
.źródło
struct
znakupublic
jest bardziej prawdopodobne, że będzie błędem niż ostrzeżenie, które próbujemy zamaskować. (Prawdopodobnie nie powinieneś niepotrzebnie ujawniać typów używanych do wewnętrznej implementacji, a typy z polami publicznymi prawdopodobnie nie należą do publicznego interfejsu API). Żeby tylko wzmocnić twoją radę, że takie typy powinny być „raczejinternal
lubprivate
” ;-).JsonConvert.DeserializeObject
i deserializuję do klasy publicznej, która ma tylko wszystkie ujawnione właściwości, dzięki czemu wiem, co zostanie zwrócone. Samo uczynienie z niej klasy publicznej, która jest pusta ze wszystkimi publicznymi ciągami, jest fajnym, krótkim kodem i nie ma już więcej ostrzeżeń. Być może użycie klasy dynamicznej byłoby lepsze, ponieważ nie musisz jawnie określać, co jest w tablicy, ale myślę, że będzie to dobre odniesienie dla każdego, kto chce użyć obiektu.Dostałem VS do wygenerowania szkieletu implementacji dla
System.ComponentModel.INotifyPropertyChanged
i zdarzenia zostały zaimplementowane jako pola, które wyzwoliły ostrzeżenia CS0067.Zamiast rozwiązania podanego w zaakceptowanej odpowiedzi zamieniłem pola na właściwości i ostrzeżenie zniknęło .
Ma to sens, ponieważ cukier składni deklaracji właściwości jest kompilowany do pola plus metody pobierające i / lub ustawiające (w moim przypadku dodaj / usuń), które odwołują się do pola. To spełnia wymagania kompilatora, a ostrzeżenia nie są zgłaszane:
źródło
<GetHeader>k__BackingField
w zależności od szczegółów implementacji używanego kompilatora C #.Użytkownicy C / C ++ muszą
(void)var;
pomijać ostrzeżenia o nieużywanych zmiennych. Właśnie odkryłem, że możesz również pomijać ostrzeżenia o nieużywanych zmiennych w C # za pomocą operatorów bitowych:Oba wyrażenia nie generują nieużywanych ostrzeżeń o zmiennych w kompilatorach VS2010 C # 4,0 i Mono 2,10.
źródło
uint
przypadku innych typów plików, takich jakException
. Czy znasz ogólny trik będący odpowiednikiem C / C ++var;
?error.ToString();
dla zmiennej typuException