590 Stimmen

Wie können Sie optionale Parameter in C# verwenden?

Nota: Diese Frage wurde zu einer Zeit gestellt, als C# noch keine optionalen Parameter unterstützte (d.h. vor C# 4).

Wir erstellen eine Web-API, die programmatisch aus einer C#-Klasse generiert wird. Die Klasse hat die Methode GetFooBar(int a, int b) und die API hat eine Methode GetFooBar mit Abfrageparametern wie &a=foo &b=bar .

Die Klassen müssen optionale Parameter unterstützen, was in der Sprache C# nicht unterstützt wird. Was ist der beste Ansatz?

29voto

kristi_io Punkte 409

Sie können optionale Parameter in C# 4.0 ohne Bedenken verwenden. Wenn wir eine Methode wie haben:

int MyMetod(int param1, int param2, int param3=10, int param4=20){....}

Wenn Sie die Methode aufrufen, können Sie die Parameter wie folgt überspringen:

int variab = MyMethod(param3:50; param1:10);

C# 4.0 implementiert eine Funktion namens "named parameters", können Sie tatsächlich übergeben Parameter durch ihre Namen, und natürlich können Sie Parameter in beliebiger Reihenfolge übergeben Sie wollen :)

26voto

SteakOverflow Punkte 5700

Ein einfacher Weg, der es Ihnen ermöglicht, auf Folgendes zu verzichten beliebige Parameter en jede Position nutzt die Vorteile von löschbare Typen wie folgt:

public void PrintValues(int? a = null, int? b = null, float? c = null, string s = "")
{
    if(a.HasValue)
        Console.Write(a);
    else
        Console.Write("-");

    if(b.HasValue)
        Console.Write(b);
    else
        Console.Write("-");

    if(c.HasValue)
        Console.Write(c);
    else
        Console.Write("-");

    if(string.IsNullOrEmpty(s)) // Different check for strings
        Console.Write(s);
    else
        Console.Write("-");
}

Strings sind bereits nullbare Typen und benötigen daher nicht die ? .

Sobald Sie diese Methode haben, sind die folgenden Aufrufe alle gültig :

PrintValues (1, 2, 2.2f);
PrintValues (1, c: 1.2f);
PrintValues(b:100);
PrintValues (c: 1.2f, s: "hello");
PrintValues();

Wenn Sie eine Methode auf diese Weise definieren, haben Sie die Freiheit, genau die Parameter zu setzen, die Sie wollen, indem Sie Namensgebung sie. Weitere Informationen zu benannten und optionalen Parametern finden Sie unter dem folgenden Link:

Benannte und optionale Argumente (C# Programmierhandbuch) @ MSDN

20voto

Hugh Allen Punkte 6367

Hallo optionale Welt

Wenn Sie möchten, dass die Laufzeit einen Standard-Parameterwert liefert, müssen Sie den Aufruf mit Reflection durchführen. Nicht so schön wie die anderen Vorschläge für diese Frage, aber kompatibel mit VB.NET.

using System;
using System.Runtime.InteropServices;
using System.Reflection;

namespace ConsoleApplication1
{
    class Class1
    {
        public static void sayHelloTo(
            [Optional,
            DefaultParameterValue("world")] string whom)
        {
            Console.WriteLine("Hello " + whom);
        }

        [STAThread]
        static void Main(string[] args)
        {
            MethodInfo mi = typeof(Class1).GetMethod("sayHelloTo");
            mi.Invoke(null, new Object[] { Missing.Value });
        }
    }
}

9voto

Vivek Punkte 16076

Ich stimme mit stephenbayer überein. Aber da es sich um einen Webservice handelt, ist es für den Endbenutzer einfacher, nur eine Form der Webmethode zu verwenden, als mehrere Versionen der gleichen Methode zu benutzen. Ich denke, in dieser Situation sind Nullable Types perfekt für optionale Parameter.

public void Foo(int a, int b, int? c)
{
  if(c.HasValue)
  {
    // do something with a,b and c
  }
  else
  {
    // do something with a and b only
  }  
}

7voto

baskinhu Punkte 71

Optionale Parameter sind für Methoden. Wenn Sie optionale Argumente für eine Klasse benötigen und Sie sind:

  • mit c# 4.0: verwenden Sie optionale Argumente im Konstruktor der Klasse, eine Lösung, die ich bevorzuge, da es näher an das, was mit Methoden getan wird, so leichter zu merken. hier ist ein Beispiel:

    class myClass
    {
        public myClass(int myInt = 1, string myString =
                               "wow, this is cool: i can have a default string")
        {
            // do something here if needed
        }
    }
  • bei c#-Versionen vor c#4.0: Sie sollten die Konstruktorverkettung verwenden (mit dem Schlüsselwort :this), wobei einfachere Konstruktoren zu einem "Hauptkonstruktor" führen. Beispiel:

    class myClass
    {
        public myClass()
        {
        // this is the default constructor
        }
    
        public myClass(int myInt)
            : this(myInt, "whatever")
        {
            // do something here if needed
        }
        public myClass(string myString)
            : this(0, myString)
        {
            // do something here if needed
        }
        public myClass(int myInt, string myString)
        {
            // do something here if needed - this is the master constructor
        }
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X