unikanie WYJĄTKÓW null reference

Najwyraźniej zdecydowana większość błędów w kodzie to wyjątki null reference. Czy istnieją jakieś ogólne techniki, aby uniknąć napotkania błędów odniesienia null?

O ile się nie mylę, zdaję sobie sprawę, że w językach takich jak F# nie można mieć wartości null. Ale to nie jest pytanie, pytam jak uniknąć błędów null reference w językach takich jak C#.

Author: Nippysaurus, 2009-12-22

15 answers

Gdy użytkownik wyświetla wyjątek null reference, oznacza to defekt w kodzie wynikający z błędu programisty. Oto kilka pomysłów, jak zapobiec tym błędom.

Moja najlepsza rekomendacja dla osób, które dbają o jakość oprogramowania, a także używają the.net platforma programistyczna, polega na instalacji i wykorzystaniu Microsoft code contracts (http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx ). Zawiera możliwości wykonywania sprawdzanie i statyczna weryfikacja. Podstawowa możliwość budowania tych umów w Twoim kodzie jest zawarta w wersji 4.0 the.net ramy. Jeśli interesuje Cię jakość kodu i brzmi to tak, możesz naprawdę cieszyć się korzystaniem z Microsoft code contracts.

W Microsoft code contracts możesz chronić swoją metodę przed wartościami null, dodając warunki wstępne, takie jak "Contract.Wymaga (klient != null);". Dodanie takiego warunku jest równoznaczne z praktyka polecana przez wielu innych w komentarzach powyżej. Przed zakodowaniem umów polecam zrobić coś takiego

if (customer == null) {throw new ArgumentNullException("customer");}

Teraz polecam

Contract.Requires(customer != null);

Możesz następnie włączyć system sprawdzania czasu pracy, który wykryje te wady tak wcześnie, jak to możliwe, prowadząc do diagnozy i korekty wadliwego kodu. Ale nie pozwól mi sprawiać wrażenia, że kontrakty kodowe są po prostu fantazyjnym sposobem na zastąpienie WYJĄTKÓW argumentu null. Są bardzo potężniejsze niż to. W przypadku kontraktów kodowych firmy Microsoft Możesz również uruchomić Kontroler statyczny i poprosić go o zbadanie możliwych miejsc w kodzie, w których mogą wystąpić wyjątki null reference. Sprawdzanie statyczne wymaga nieco więcej doświadczenia, aby łatwo z niego korzystać. Nie polecam go najpierw dla początkujących. Ale nie krępuj się wypróbować i zobaczyć na własne oczy.

BADANIE CZĘSTOŚCI WYSTĘPOWANIA BŁĘDÓW ODNIESIENIA NULL

W tym wątku była dyskusja na temat tego, czy null reference błędy są istotnym problemem. Długa odpowiedź znajduje się poniżej. Dla ludzi, którzy nie chcą przez to przebrnąć, podsumuję.

    [[19]] czołowi badacze Microsoftu w poprawność programu na Spec# i projekty umów kodowych problem wart rozwiązania. Dr Bertrand Meyer i zespół inżynierów oprogramowania w ISE, którzy opracowanie i wsparcie Eiffla język programowania, także uwierz to problem, który warto rozwiązać.
  • In my own doświadczenie handlowe w tworzeniu zwykłego oprogramowania, widziałem błędy null reference na tyle często, że chciałbym rozwiązać ten problem w moich własnych produktach i praktykach.
Od lat Microsoft inwestuje w badania mające na celu poprawę jakości oprogramowania. Jednym z ich wysiłków był projekt Spec#. Jednym z najbardziej ekscytujących wydarzeń moim zdaniem z the.net 4.0 framework, to wprowadzenie Microsoft code contracts, które jest wynikiem wcześniejszych prac przez Spec # research team.

Jeśli chodzi o Twoją uwagę "zdecydowana większość błędów w kodzie to wyjątki zerowe", uważam, że kwalifikator "zdecydowana większość" spowoduje pewne nieporozumienia. Wyrażenie "zdecydowana większość" sugeruje, że być może 70-90% błędów ma zerowy wyjątek referencyjny jako przyczynę. To wydaje mi się zbyt wysokie. Wolę cytować z badań Microsoft Spec#. W artykule The Spec # programming system: An overview, by Mike Barnett, K. Rustan M. Leino i Wolfram Schulte. In CASSIS 2004, LNCS vol. 3362, 2004, napisali

1.0 typy Non-Null wiele błędów we współczesnych programach objawia się jako null-błędy dereferencyjne, sugerujące znaczenie programowania język dający możliwość rozróżniać wyrażenia, które może oceniać na null i te, które na pewno nie (dla niektórych eksperymentalnych dowody, zob. [24, 22]). W rzeczywistości, my chciałbym wykorzenić wszystkie null błędy dereferencyjne.

Jest to prawdopodobne źródło dla osób z Microsoftu, które są zaznajomione z tymi badaniami. Ten artykuł jest dostępny na stronie Spec#.

Skopiowałem referencje 22 i 24 poniżej, i dołączam ISBN dla Twojej wygody.

  • Manuel Fahndrich i K. Rustan M. Leino. Deklarowanie i sprawdzanie typów innych niż null w język zorientowany obiektowo. W ramach konferencji ACM 2003 na temat Obiektowego Programowanie, Systemy, Languages, and Applications, OOPSLA 2003, volume 38, number 11 w ogłoszeniach SIGPLAN, S. 302-312. ACM, listopad 2003. isbn = {1-58113-712-5},

  • Cormac Flanagan, K. Rustan M. Leino, Mark Lillibridge, Greg Nelson, James B. Saxe, i Raymie Stata. Rozszerzone sprawdzanie statyczne dla Javy. W postępowaniu ACM 2002 Konferencja SIGPLAN dotycząca projektowania i implementacji języka programowania (PLDI), Tom 37, nr 5 w ogłoszeniach SIGPLAN, S. 234-245. ACM, maj 2002.

Przejrzałem te referencje. Pierwsze odniesienie wskazuje na pewne eksperymenty, które przeprowadzili, przeglądając własny kod pod kątem możliwych wad odniesienia null. Nie tylko znaleźli kilka, ale w wielu przypadkach identyfikacja potencjalnego odniesienia zerowego wskazywała na szerszy problem z projektem.

Drugie odniesienie nie dostarcza żadnych konkretnych dowodów na twierdzenie, że null błędy odniesienia są problemem. Autorzy stwierdzają jednak, że w ich doświadczenie, te zerowe błędy odniesienia są znaczącym źródłem wad oprogramowania. Następnie artykuł wyjaśnia, w jaki sposób starają się wyeliminować te wady.

Pamiętam też, że widziałem coś o tym w ogłoszeniu Z ISE na temat niedawnego wydania Eiffla. Odnoszą się do tego problemu jako "void bezpieczeństwa", i jak tak wiele rzeczy inspirowane lub opracowane przez dr Bertrand Meyer, mają wymowny i edukacyjny opis problemu i jak go o zapobieganie w ich język i narzędzia. Polecam przeczytać ich artykuł http://doc.eiffel.com/book/method/void-safety-background-definition-and-tools aby dowiedzieć się więcej.

Jeśli chcesz dowiedzieć się więcej o umowach kodowych firmy Microsoft, Istnieje mnóstwo artykułów, które powstały niedawno. Możesz również sprawdzić mój blog pod adresem http: SLASH SLASH codecontracts.info który poświęcony jest przede wszystkim rozmowom o jakości oprogramowania poprzez wykorzystanie programowania z kontraktami.

 28
Author: David Allen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-17 04:44:11

Oprócz powyższych (Null Objects, Empty Collections), istnieje kilka ogólnych technik, mianowicie pozyskiwanie zasobów jest inicjalizacją (RAII) z C++ i Design by Contract z Eiffla. Sprowadzają się do:

  1. Zainicjalizuj zmienne poprawnymi wartościami.
  2. jeśli zmienna może być null, to albo sprawdź null i traktuj ją jako specjalny przypadek, albo oczekuj wyjątku od null (i radź sobie z tym). Twierdzenia mogą być wykorzystane do badania naruszeń umowy w rozwój buduje.

Widziałem sporo kodu, który wygląda tak:

If ((wartość != null) & & (value.getProperty() != null)&&... && (...doSomethingUseful ())

Przez większość czasu jest to całkowicie niepotrzebne i większość testów może zostać usunięta z bardziej rygorystyczną inicjalizacją i ściślejszymi definicjami umów.

Jeśli jest to problem w bazie kodu, to konieczne jest zrozumienie w każdym przypadku, co null reprezentuje:

  1. Jeśli null reprezentuje pustą kolekcję, Użyj pustej kolekcji.
  2. Jeśli null reprezentuje wyjątkowy przypadek, wyrzuć wyjątek.
  3. Jeśli null reprezentuje przypadkowo niezainicjalizowaną wartość, jawnie ją zainicjuj.
  4. Jeśli null reprezentuje legalną wartość, przetestuj ją - lub jeszcze lepiej Użyj obiektu NullObject, który wykonuje operację null.

W praktyce ten standard jasności na poziomie projektu jest nietrywialny i wymaga wysiłek i samodyscyplina, aby konsekwentnie stosować się do bazy kodu.

 20
Author: richj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-22 01:03:18

Nie wiesz.]}

A raczej, nie ma nic specjalnego do zrobienia, aby spróbować 'zapobiec' NREs w C#. W większości przypadków NRE to tylko jakiś rodzaj błędu logicznego. Możesz je zapalić na granicach interfejsu, sprawdzając parametry i mając dużo kodu, takiego jak

void Foo(Something x) {
    if (x==null)
        throw new ArgumentNullException("x");
    ...
}

Wszędzie (większość. Net Framework tak robi), tak, że kiedy nawalisz, otrzymasz nieco bardziej pouczającą diagnostykę (ślad stosu jest jeszcze bardziej wartościowy, a NRE również to zapewnia). Ale i tak kończysz z wyjątkiem.

(pomijając: wyjątki takie jak te-Nullreferencexception, ArgumentNullException, ArgumentException, ... - zazwyczaj nie powinien być złapany przez program, ale raczej oznacza po prostu "twórca tego kodu, jest błąd, proszę go naprawić". Odnoszę się do nich jako wyjątki "design time"; kontrastuję je z prawdziwymi wyjątkami "run time", które zdarzają się w wyniku środowiska run time (np. FileNotFound) i mają potencjalnie zostać przechwycone i obsługiwane przez program.)

/ Align = "left" /

Idealnie, większość NREs nigdy by się nie wydarzyła, ponieważ 'null' jest nonsensowną wartością dla wielu typów / zmiennych,a idealnie STATYCZNY system typów nie zezwala na 'null' jako wartość dla tych konkretnych typów/zmiennych. Wtedy kompilator uniemożliwiłby wprowadzenie tego typu przypadkowego błędu (wykluczając pewne klasy błędów są to, co kompilatory i systemy typów są najlepsze at). To tutaj wyróżnia się niektóre języki i systemy typów.

Ale bez tych funkcji, po prostu testujesz swój kod, aby upewnić się ,że nie masz ścieżek kodu z tego typu błędem(lub ewentualnie użyj zewnętrznych narzędzi, które mogą wykonać dodatkową analizę).

 7
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-22 00:57:31

Użycie wzorców obiektów Null jest tutaj kluczowe.

Upewnij się, że zbiory muszą być puste w przypadku, gdy nie są wypełnione, a nie null. Używanie kolekcji null, gdy zrobi to pusta kolekcja, jest mylące i często niepotrzebne.

Wreszcie, w miarę możliwości, moje obiekty sprawdzają wartości inne niż null podczas budowy. W ten sposób nie mam wątpliwości, czy wartości są null, i muszę tylko wykonać null checks gdzie essential . Dla większości moich pól i parametrów mogę założyć, że wartości nie są null na podstawie poprzednich twierdzeń.

 5
Author: Brian Agnew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-22 00:30:31

Jednym z najczęstszych błędów odniesienia null, które widziałem, jest łańcuch. Będzie czek:

if(stringValue == "") {}

Ale, łańcuch jest naprawdę null. Powinno być:

if(string.IsNullOrEmpty(stringValue){}

Ponadto, możesz być zbyt ostrożny i sprawdzić, czy obiekt nie jest null, zanim spróbujesz uzyskać dostęp do członków / metod tego obiektu.

 4
Author: Jim Schubert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-22 00:23:45

Możesz łatwo sprawdzić, czy odniesienie null nie powoduje wyjątku, ale zazwyczaj nie jest to prawdziwy problem, więc i tak wyrzucisz wyjątek, ponieważ kod nie może być kontynuowany bez żadnych danych.

Często głównym problemem nie jest fakt, że masz odniesienie null, ale że masz odniesienie null w pierwszej kolejności. Jeśli odniesienie nie ma być null, nie powinieneś ominąć punktu, w którym odniesienie jest inicjalizowane bez posiadania odpowiedniego Referencja.

 4
Author: Guffa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-22 00:27:50

Jednym ze sposobów jest użycie obiektów z wartością Null (aka wzorzec obiektu Null ) tam, gdzie to możliwe. Tutaj znajdziesz Więcej Szczegółów

 3
Author: Preet Sangha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-22 00:18:19

Naprawdę, jeśli w Twoim języku są wartości null, to na pewno się stanie. Null reference errors pochodzą z błędów w logice aplikacji - więc jeśli nie możesz uniknąć wszystkich tych, które na pewno trafisz.

 3
Author: Jeremy Raymond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-22 00:20:24

Odpowiednie użycie strukturalnej obsługi wyjątków może pomóc uniknąć takich błędów.

Testowanie jednostkowe może również pomóc upewnić się, że kod zachowuje się zgodnie z oczekiwaniami, w tym upewnić się, że wartości nie są null, gdy nie powinny być.

 2
Author: Andy West,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-22 00:20:58

Jednym z najprostszych sposobów uniknięcia NullReferenceExceptions jest agresywne sprawdzanie referencji null w konstruktorach klas/metodach / ustawiaczach właściwości i zwrócenie uwagi na problem.

Np.

public MyClass
{
   private ISomeDependency m_dependencyThatWillBeUsedMuchLater 

   // passing a null ref here will cause 
   // an exception with a meaningful stack trace    
   public MyClass(ISomeDependency dependency)
   {
      if(dependency == null) throw new ArgumentNullException("dependency");

      m_dependencyThatWillBeUsedMuchLater = dependency;
   }

   // Used later by some other code, resulting in a NullRef
   public ISomeDependency Dep { get; private set; }
}

W powyższym kodzie, jeśli przekażesz null ref, natychmiast dowiesz się, że kod wywołujący używa tego typu nieprawidłowo. Jeśli nie było sprawdzania null reference, błąd może zostać przysłonięty na wiele różnych sposobów.

Zauważysz, że. NET framework biblioteki prawie zawsze zawodzą wcześnie i często, jeśli podasz odwołania null tam, gdzie jest to nieprawidłowe. Ponieważ wyjątek rzucony wyraźnie mówi "nawaliłeś!"i mówi ci dlaczego, sprawia, że wykrywanie i korygowanie wadliwego kodu jest banalnym zadaniem.

Słyszałem skargi od niektórych programistów, którzy twierdzą, że ta praktyka jest zbyt gadatliwa i zbędna, ponieważ Nullreferencexception jest wszystkim, czego potrzebujesz, ale w praktyce uważam, że robi to dużą różnicę. Jest to szczególnie w przypadku, gdy połączenie stos jest głęboki i / lub parametr jest przechowywany, a jego użycie jest odroczone na później (być może w innym wątku lub zasłonięte w inny sposób).

Co byś wolał, ArgumentNullException przy metodzie wejścia, czy niejasny błąd w bebechach? Im dalej oddalasz się od źródła błędu, tym trudniej jest go wyśledzić.

 2
Author: Mark Simpson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-22 01:05:12

Dobre narzędzia do analizy kodu mogą tu pomóc. Dobre testy jednostkowe mogą również pomóc, jeśli używasz narzędzi, które uważają null za możliwą ścieżkę do kodu. Spróbuj wrzucić ten przełącznik w Ustawieniach kompilacji, który mówi "traktuj ostrzeżenia jako błędy" i sprawdź, czy możesz zachować # ostrzeżeń w projekcie = 0. Może się okazać, że ostrzeżenia mówią ci wiele.

Należy pamiętać, że może to byćdobra rzecz , że rzucasz wyjątek null - reference. Dlaczego? ponieważ to może oznaczać, że kod, który powinien został wykonany nie. Inicjowanie wartości domyślnych jest dobrym pomysłem, ale należy uważać, aby nie ukryć problemu.

List<Client> GetAllClients()
{
    List<Client> returnList = new List<Client>;
    /* insert code to go to data base and get some data reader named rdr */
   for (rdr.Read()
   {
      /* code to build Client objects and add to list */
   }

   return returnList;
}

W porządku, więc może to wyglądać dobrze, ale w zależności od twoich zasad biznesowych, może to być problem. Oczywiście, nigdy nie rzucisz odniesienia null, ale może Twoja tabela użytkownika nigdy nie powinna być pusta? Czy chcesz, aby Twoja aplikacja kręciła się w miejscu, generując połączenia wsparcia od użytkowników mówiących "to tylko pusty ekran", lub czy chcesz zgłosić wyjątek, który może zostać gdzieś zarejestrowany i szybko ogłosić alert? Nie zapomnij zweryfikować tego, co robisz, a także "obsługiwać" wyjątki. Jest to jeden z powodów, dla których niektórzy brzydzą się usuwaniem null z naszych języków... ułatwia to znalezienie błędów, nawet jeśli może to spowodować kilka nowych.

Pamiętaj: obsługuj wyjątki, nie ukrywaj ich.

 1
Author: Jim L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-22 01:45:39

Plain Code Solution

Zawsze można utworzyć strukturę, która pomaga wcześniej wychwycić null reference errors, oznaczając zmienne, właściwości i parametry jako "not nullable". Oto przykład koncepcyjnie wzorowany na sposobie działania Nullable<T>:

[System.Diagnostics.DebuggerNonUserCode]
public struct NotNull<T> where T : class
{
    private T _value;

    public T Value
    {
        get
        {
            if (_value == null)
            {
                throw new Exception("null value not allowed");
            }

            return _value;
        }
        set
        {
            if (value == null)
            {
                throw new Exception("null value not allowed.");
            }

            _value = value;
        }
    }

    public static implicit operator T(NotNull<T> notNullValue)
    {
        return notNullValue.Value;
    }

    public static implicit operator NotNull<T>(T value)
    {
        return new NotNull<T> { Value = value };
    }
}

Użyłbyś bardzo podobnie do tego samego sposobu, w jaki użyłbyś Nullable<T>, z wyjątkiem tego, aby osiągnąć dokładnie odwrotnie - nie pozwolić null. Oto kilka przykładów:

NotNull<Person> person = null; // throws exception
NotNull<Person> person = new Person(); // OK
NotNull<Person> person = GetPerson(); // throws exception if GetPerson() returns null

NotNull<T> jest implicite odlewany do i z T, więc możesz go używać wszędzie, gdzie go potrzebujesz. Na przykład możesz przekazać obiekt {[12] } do metody, która pobiera NotNull<Person>:

Person person = new Person { Name = "John" };
WriteName(person);

public static void WriteName(NotNull<Person> person)
{
    Console.WriteLine(person.Value.Name);
}

Jak widać powyżej, podobnie jak w przypadku nullable, uzyskasz dostęp do wartości bazowej poprzez właściwość Value. Alternatywnie, możesz użyć jawnego lub niejawnego cast, możesz zobaczyć przykład z wartością zwracaną poniżej:

Person person = GetPerson();

public static NotNull<Person> GetPerson()
{
    return new Person { Name = "John" };
}

Lub można go nawet użyć, gdy metoda zwraca po prostu T (w tym przypadku Person), wykonując Obsada Na przykład następujący kod będzie tak samo jak powyższy kod:

Person person = (NotNull<Person>)GetPerson();

public static Person GetPerson()
{
    return new Person { Name = "John" };
}

Połącz z rozszerzeniem

Połącz NotNull<T> z metodą rozszerzenia, a możesz pokryć jeszcze więcej sytuacji. Oto przykład jak może wyglądać metoda rozszerzenia:

[System.Diagnostics.DebuggerNonUserCode]
public static class NotNullExtension
{
    public static T NotNull<T>(this T @this) where T : class
    {
        if (@this == null)
        {
            throw new Exception("null value not allowed");
        }

        return @this;
    }
}

A oto przykład, jak można go użyć:

var person = GetPerson().NotNull();

GitHub

W celach informacyjnych udostępniłem powyższy kod na Githubie, możesz go znaleźć at:

Https://github.com/luisperezphd/NotNull

 1
Author: Luis Perez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-08 01:49:20

Możesz użyć null wzorzec obiektu i Specjalny wzorzec przypadku w przypadkach, gdy istnieje uzasadniony obiekt, który może zastąpić null.

W przypadkach, gdy taki obiekt nie może być skonstruowany, ponieważ po prostu nie ma sposobu na zaimplementowanie jego obowiązkowych operacji, można polegać na pustych kolekcjach, np. w Map-Reduce Queries.

Innym rozwiązaniem jest opcja functional type , która jest zbiorem z zerowymi lub jednymi elementami. W ten sposób, będziesz miał możliwość pominięcia operacji, której nie można wykonać.

Są to opcje, które mogą pomóc w pisaniu kodu bez żadnych referencji null i sprawdzania null.

 0
Author: Zoran Horvat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-10 09:13:29

Narzędzia, które mogą pomóc

Istnieje również kilka bibliotek, które mogą pomóc. Microsoft Code Contracts został wymieniony powyżej.

Niektóre inne narzędzia obejmują Resharper , które mogą dostarczać ostrzeżenia podczas pisania kodu, zwłaszcza jeśli używasz ich atrybutu: NotNullAttribute

Istnieje również PostSharp , który pozwoli Ci używać takich atrybutów jak:

public void DoSometing([NotNull] obj)

Robiąc to i czyniąc PostSharp częścią twojego proces budowania obj będzie sprawdzany pod kątem null w czasie wykonywania. Zobacz: PostSharp null check

Projekt Fody code-weaving ma wtyczkę do implementacji null guards.

 0
Author: Luis Perez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-29 12:57:09

NullReferenceException można wyświetlić, gdy metoda nie została znaleziona w złożeniu, dla ex m0=mi.GetType ().GetMethod ("TellChildToBeQuiet"), gdzie montaż jest SportsMiniCar, mi jest instancją minivana, a TellChildToBeQuiet jest metodą w montażu. Możemy tego uniknąć widząc, że wersja assembly 2.0.0.0 zawierająca powyższą metodę jest umieszczona w GAC. przykład: wywołanie metod z parametrami` '

enter code here

using System;
using System.Rwflection;
using System.IO;
using Carlibraries;
namespace LateBinding
{
public class program
{
   static void Main(syring[] args)
   {
         Assembly a=null;
         try
         {
              a=Assembly.Load("Carlibraries");
         }
         catch(FileNotFoundException e)
         {
               Console.Writeline(e.Message);
               Console.ReadLine();
               return;
         }
         Type miniVan=a.GetType("Carlibraries.MiniVan");
         MiniVan mi=new MiniVan();
         mi.TellChildToBeQuiet("sonu",4);
         Console.ReadLine();
       }
   }
   }

Pamiętaj o aktualizacji zestawu MiniSportsCar z TellChildToBeQuiet (string ChildName,int count)

 -1
Author: Sujit Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-16 23:03:42