Er det en måte å kreve at et argument gitt til en metode er ikke null?

stemmer
4

Finnes det en bedre måte å kreve at et argument ikke er null i en metode? Jeg fortsette å se om noen av de argumentene som min metode krever er null, som vist nedenfor. Men jeg lurer på om det er en bedre måte.

public void MyMethod(string a, int b)
{
   if(a==null){throw new ArgumentNullException(a);}
   if(b==null){throw new ArgumentNullException(b);}

   //more stuff here
}
Publisert på 16/04/2009 klokken 00:31
kilden bruker
På andre språk...                            


5 svar

stemmer
1

Det er ingen annen bedre måte. Dette er måten massevis av Microsofts biblioteker håndtere situasjonen.

Du kan alltid bruke en skjøte metode for å gjøre det litt klarere.

static IsNullArgument(this Object o, string arg)
{
    if (o == null)
        throw ArgumentNullException(arg);
}
Svarte 16/04/2009 kl. 00:34
kilden bruker

stemmer
1

Jeg personlig liker CuttingEdge.Conditions . Det er enkelt å bruke, og gjør dette mye mer lesbar.

Svarte 16/04/2009 kl. 00:42
kilden bruker

stemmer
0

Rick Brewster (forfatter av Paint.NET) blogget om en Flytende API alternativ:

http://blog.getpaint.net/2008/12/06/a-fluent-approach-to-c-parameter-validation/

Svarte 16/04/2009 kl. 00:47
kilden bruker

stemmer
1

Dette er en av de få områdene hvor jeg tror C # gikk bakover fra C ++.

I C ++, kan du skrive

void foo(Bar& bar) { /*...*/ }

til ganske tydelig viser til både kompilatoren og andre mennesker som footok en faktisk forekomst av Bar. Ja, det er mulig - med innsats - for å passere fooen null referanse, men det er egentlig ikke lovlig C ++.

Din eneste "løsning" (slags) i C # er å classes structs stedet, som verdityper i .NET kan ikke være null(i ditt eksempel, b kan aldri være nullfordi det er en System.Int32). Kallet til bar()vil ikke kompilere:

    class A { }
    struct B { }

    static void foo(A a) { }
    static void bar(B b) { }

    static void Main(string[] args)
    {
        foo(null);
        bar(null);
    }

Det virker absolutt som om det ville ha vært fint for C # for å ha gjort det (mye) mer vanskelig å ha nullreferanser; F #, for eksempel, har ingen kan ha nullverdier typer.

For noen interessante kommentarer knyttet til denne saken, lese Null Referanser: milliarder dollar Mistake (og kommentarene).


Edit: En februar 2013 fotnote fra Eric Lippert sier" ... det bare så skjedde at når C # ble først implementert det hadde alltid kan nullstilles referansetyper, ... det virker sannsynlig at Nullable<T>kunne ha blitt iverksatt for å fungere på en hvilken som helst type, og referansetyper vil da være ikke-ha nullverdier som standard. Vi kunne ha en type system der Nullable<string>var den eneste lovlige måten å representere "en streng som kan være null". ... "

Svarte 16/04/2009 kl. 01:13
kilden bruker

stemmer
0

Du kan skrive noen nytte metoder. Dette er den vanligste mønsteret i java.

brukerkode:

public void MyMethod(string a, int b)
{
    //validate each
    Objects.RequireNotNull(a);
    Objects.RequireNotNull(b);

    //or validate in single line as array 
    Objects.RequireNotNullArray(a, b);
}

implementering kode:

public static class Objects
{
    public static T RequireNotNull<T>(T arg)
    {
        if(arg == null)
        {
            throw new ArgumentNullException();
        }
        return arg;
    }

    public static object[] RequireNotNullArray(params object[] args)
    {
        return RequireNotNullArray<object>(args);
    }

    public static T[] RequireNotNullArray<T>(params T[] args)
    {
        Objects.RequireNotNull(args);
        for(int i=0; i<args.Length; i++)
        {
            T arg = args[i];
            if(arg == null)
            {
                throw new ArgumentNullException($"null entry at position:{i}");
            }
        }
        return args;
    }

}

Du kan ikke få variabelnavnet i unntaket. men med stakksporingen og kildekoden, bør det være mulig å enkelt spore opp.

Svarte 15/12/2018 kl. 06:14
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more