C# Jak poprawnie obsługiwać System.NullReferenceException

0

Chciałbym się dowiedzieć jak poprawnie obsługiwać takie wyjątki.
Podam przykład. Tworzę klasę :

    {
        public string? name { get; set; }
        public string? message { get; set; }
        public string? target { get; set; }
        public string? commit { get; set; }
        public string? release { get; set; }
        public bool? _protected { get; set; }
    }

W programie tworzę i wypełniam listę tags
List<Tags> tags = new List<Tags>();
Potem np. chcę wypisać co znajduje się w liście:

foreach (var item in tags) 
                        {
                        Console.WriteLine( item.name + ";" + item.target + ";" + item.release";"); ;
                        }

Problem pojawia się gdy w któryś z tagów nie posiada jakiejś wartości i pojawia się błąd z tematu.
Radzę dobie tak:

string target_checked 
if (item.target = null ) target_checked = "brak"
else target check = item.target;
foreach (var item in tags) 
                        {
                        Console.WriteLine( item.name + ";" + target_checked + ";" + item.release";"); ;
                        }

Chciałbym wiedzieć czy jest jakieś "normalniejsze" obejście takiego problemu. Bo takie IF muszę napisać dla każdego z parametrów klasy aby mieć pewność że wypisywanie zawartości listy nie wywali się na którymś z nich.

2

Używaj item?.name zamiast item.name. Poza tym w C# jest konwencja, że nazwy właściwości pisane są z wielkiej litery.

4

jw. a jak chcesz jawnie zakumunikować ze jest brak wartości to moze w ten sposób:

item?.name ?? "brak"
0

W kilku projektach coraz śmielej używam refleksji w krótkich snippetach.
Takie coś przekształciłem dla Ciebie (na marginesie, nie podoba mi się nazwa klasy Tags, chyba powinno być Tag)

Tags obj; 

Type typ = typeof(Tags);
foreach (var fld in typ.GetProperties())
{
       if(fdl.GetValue(obj)==null)
       {
       }
 }

Niby się nie powinno, niby jest wolne ... ale niczego nie wysadza w powietrze. Na prozaicznych obiektach biznesowych "dla pani Krysi" coraz bardziej mi się podoba (nie to, że nie znałem refleksji, ale używałem do większych dzieł).

PS. dla każdego z parametrów klasy -> dla każdego z pół (właściwości) klasy. Klasa nie ma parametrów.

0

Mieszasz składnię PHP ze składnią java...

Ad foreach (var item in tags) { Console.WriteLine(item.commit.id + ";" + item.name + ";" + item.commit.short_id + ";" + item.release?.description ?? "BRAK" + ";") ;
przenieś właściwą część do tego swojego itema:

class ItemModel
{
public static readonly string Empty = $"null;null;null;{ReleaseModel.EmptyDescription};";
// ...
override public string ToString() => $"{Commit?.Id};{Name};{Commit?.ShortId};{(Release?.description ?? ReleaseModel.EmptyDescription)};") ;
}
// ...

tags.ForEach(t => Console.WriteLine(t?.ToString() ?? ItemModel.Empty));

Ewentualnie jakiś nieco zgrabniejszy sposób na ogarnięcie odpowiedzialności klas za swoje bebechy.

BTW ta część jest bez sensu, ponieważ string jest klasą i może mieć wartość null

        public string? name { get; set; }
        public string? message { get; set; }
        public string? target { get; set; }
        public string? commit { get; set; }
        public string? release { get; set; }

1 użytkowników online, w tym zalogowanych: 0, gości: 1