C# - metoda zwracająca null

C# - metoda zwracająca null
aksimoN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

Mam taką metodę:

Kopiuj
static string[] find_in_dict(string toFind, List<string[]> Dict)
        {
            string[] result = Dict.Find(x => x[0] == toFind);            
            return result;            
        }

Problem zaczyna się przy jej wywołaniu ponieważ jeśli nic nie znajdzie result is null. Czy można jakoś wywołać tą metodę w taki sposób aby jeśli zwróci null nie wywalała się mi programu?
Czy może bardziej prawidłowo jest nie zwracać null'a z metody tylko jakąś charakterystyczną wartość?

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5025
PI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 208
0

Chyba:

Kopiuj
static string[]? find_in_dict(string toFind, List<string[]> Dict)

spełni swoje zadanie o ile kompilator przyjmie.

Dodałem tylko znak zapytania po nawiasach, to oznacza, że typ jest nullable.

kzkzg
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 935
0

Sprawdź po prostu czy to co otrzemales z metody nie jest nullem.

VarrComodoo
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Bk
  • Postów: 480
0

Nie rozumiem tej metody, w parametrze podajesz List<string[]>, w metodzie chcesz zwrocic string[], ok, ale dane do result szukasz jakby tylko w jednym elemencie listy Dict, po x, ktory jest elementem tablicy string[], ktora jest elementem List<string[]>. Ale moge glupoty pisac, dopiero sie ucze.

maszrum
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 219
0

@aksimoN: Może po prostu zwróć wtedy pustą tablicę Array.Empty<string>().

A jeśli to nie spełni twoich oczekiwań to zainteresuj się typem Either<TResult, TError>, zaczerpniętego z programowania funkcyjnego. Albo Optional<T>, jak już @lion137 wspomniał. Tutaj jest wątek, który być może cię nakieruje.

Edit:
Jest jeszcze jedno rozwiązanie, które często jest wykorzystywane w .NET

Kopiuj
bool TryFindInDict(string toFind, List<string[]> dict, [NotNullWhen(true)] out string[] result)
{
    ...
}

Wtedy jako wynik funkcji zwracasz czy wyszukiwanie powiodło się, a w result wynik tego wyszukiwania.

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
0

Problem zaczyna się przy jej wywołaniu ponieważ jeśli nic nie znajdzie result is null. Czy można jakoś wywołać tą metodę w taki sposób aby jeśli zwróci null nie wywalała się mi programu?

tak. Zwracaj liste zamiast tablicy

Kopiuj
       static List<string> find_in_dict(string toFind, List<string[]> Dict)
        {
            var result = Dict.Find(x => x[0] == toFind).ToList();            
            return result;            
        }

teraz po prostu robisz foreach na rezultacie z tej funkcji. Jezeli nic nie bedzie kolekcja bedzie pusta foreach sie nie wykona

aksimoN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

Posłuchałem @pikob:

Kopiuj
static string[]? find_in_dict(string toFind, List<string[]> Dict)

wywołuję ją w IF i sprawdzam czy zwróciła null:

Kopiuj
if (find_in_dict(args[0], Dict) is null) Console.WriteLine("Podano niewłaściwy argument, nie ma takiego w słowniku");
else ...........
WeiXiao
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5227
0

w ogóle szkoda że momentami error handling w .NETcie ssie

np. LINQowe .FirstOrDefault dla value types, więc zazwyczaj pozostaje albo cast, albo exception albo ewentualnie napisanie własnego FirstOrResult czy FirstOrNull

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.