Member mit einer variablen Anzahl von Parametern
Arrays werden verwendet, um eine variable Anzahl von Parametern an einen Member zu übergeben. Einige Sprachen, z. B. C#, stellen ein Schlüsselwort bereit, das ein Array ergänzt, mit dem variable Argumente übergeben werden. Für Sprachen, die kein Schlüsselwort bereitstellen, stellt das ParamArrayAttribute-Attribut diese Funktionalität bereit. Das Schlüsselwort bzw. Attribut wirkt sich auf den letzten Parameter in der Signatur eines Members aus. Dieser Parameter muss ein eindimensionales Array sein.
Im folgenden Codebeispiel wird das Definieren und Aufrufen einer Methode veranschaulicht, die eine variable Anzahl von Parametern akzeptiert. Beachten Sie, dass in der DemonstrateVariableParameters-Methode die Argumente erst nach dem Aufruf von UseVariableParameters in das Array eingefügt werden.
Public Shared Sub UseVariableParameters(ParamArray list() as Integer)
For i as Integer = 0 to list.Length -1
Console.WriteLine(list(i))
Next i
Console.WriteLine()
End Sub
Public Shared Sub DemonstrateVariableParameters()
Manager.UseVariableParameters(1,2,3,4,5)
End Sub
public static void UseVariableParameters(params int[] list)
{
for ( int i = 0 ; i < list.Length ; i++ )
{
Console.WriteLine(list[i]);
}
Console.WriteLine();
}
public static void DemonstrateVariableParameters()
{
Manager.UseVariableParameters(1,2,3,4,5);
}
static void UseVariableParameters(... array<int>^ list)
{
for ( int i = 0 ; i < list->Length ; i++ )
{
Console::WriteLine(list[i]);
}
Console::WriteLine();
}
static void DemonstrateVariableParameters()
{
Manager::UseVariableParameters(1,2,3,4,5);
}
Anhand der folgenden Richtlinien können Sie bestimmen, wann sich die Verwendung variabler Arrays für Parameter empfiehlt.
Sie können Arrayparametern das params-Schlüsselwort hinzufügen, wenn Sie davon ausgehen, dass die Endbenutzer eine kleine Anzahl von Elementen übergeben.
Wenn der Entwickler in allgemeinen Szenarien zahlreiche Elemente übergibt, ist das params-Schlüsselwort vermutlich weniger sinnvoll, da die Wahrscheinlichkeit gering ist, dass der Entwickler eine große Anzahl von Objekten inline übergibt.
Verwenden Sie keine params-Arrays, wenn der Aufrufer nahezu immer bereits über die Eingabe in einem Array verfügt.
Beispielsweise werden Bytedaten i. d. R. in Bytearrays gespeichert und bearbeitet. Das Hinzufügen des params-Schlüsselworts zu einem Bytearray ist in einem allgemeinen Szenario nicht sinnvoll, weil Entwickler i. d. R. nicht mit einzelnen Bytes arbeiten, die nicht bereits in einem Bytearray gespeichert sind.
Verwenden Sie keine params-Arrays, wenn das Array von dem Member geändert wird, der den params-Arrayparameter akzeptiert.
Möglicherweise hat die Common Language Runtime (CLR) ein temporäres Arrayobjekt erstellt. Wenn die Methode ein temporäres Array ändert, sind die Änderungen für den Aufrufer nicht verfügbar.
Sie können das params-Schlüsselwort in einer einfachen Überladung verwenden, auch wenn es in einer komplexeren Überladung nicht verwendet werden kann.
Entwickler können die Vorteile eines params-Arrays in einer Überladung nutzen, auch wenn das Schlüsselwort nicht in allen Überladungen enthalten ist.
Ordnen Sie Parameter nach Möglichkeit so an, dass das params-Schlüsswort verwendet werden kann.
Dies bedeutet, dass ein Arrayparameter möglichst als letzter Parameter angegeben werden sollte. Im folgenden Codebeispiel wird eine falsche Parameteranordnung veranschaulicht.
Overloads Public Function Add (i as Integer,j as Integer, numberBase as Int16) _
as Integer
public int Add (int i,int j, short numberBase)
int Add (int i,int j, short numberBase)
Overloads Public Function Add (i as Integer, j as Integer, k as Integer, _
numberBase as int16) as Integer
public int Add (int i, int j, int k, short numberBase)
int Add (int i, int j, int k, short numberBase)
' Can't use params array.
Overloads Public Function Add (numbers() as Integer, numberBase as Int16) _
as Integer
// Can't use params array.
public int Add (int [] numbers, short numberBase)
// Can't use params array.
int Add (array<int>^ numbers, short numberBase)
Die Anordnung der Parameter sollte wie folgt geändert werden:
Overloads Public Function Add (numberBase as Int16, i as Integer,j as Integer) _
as Integer
public int Add (short numberBase, int i,int j)
int Add (short numberBase, int i,int j)
Overloads Public Function Add (numberBase as Int16, i as Integer, _
j as Integer, k as Integer) as Integer
public int Add (short numberBase, int i, int j, int k)
int Add (short numberBase, int i, int j, int k)
' Can use params array.
Overloads Public Function Add (numberBase as Int16, _
ParamArray numbers() as Integer) as Integer
// Can use params array.
public int Add (short numberBase, params int [] numbers)
// Can use params array.
int Add (short numberBase, ... array<int>^ numbers)
Stellen Sie für Aufrufe mit einer kleinen Anzahl von Argumenten in äußerst leistungsrelevanten APIs spezielle Überladungen und Codepfade bereit.
Wenn Sie diese Richtlinie befolgen, können Sie beim Aufruf eines Members mit einer kleinen Anzahl von Argumenten das Erstellen von Arrays vermeiden. Die Parameternamen sollten aus dem Arrayparameter im Singular vor einem numerischen Suffix bestehen. Im folgenden Codebeispiel wird eine Membersignatur veranschaulicht, die dieser Richtlinie entspricht.
Public Shared Sub WriteLine( _
format as String, _
arg0 as Object, _
arg1 as Object, _
arg2 as Object _
)
public static void WriteLine(
string format,
object arg0,
object arg1,
object arg2
)
static void WriteLine(
String^ format,
Object^ arg0,
Object^ arg1,
Object^ arg2
)
Beachten Sie, dass NULL (Nothing in Visual Basic) als params-Arrayargument übergeben werden kann.
Der Member sollte vor der Verarbeitung eines Arrays eine Überprüfung auf ein null-Array ausführen.
Verwenden Sie nicht die varargs-Methoden, die auch als Auslassungszeichen angegeben werden.
Da die varargs-Aufrufkonvention nicht CLS-kompatibel ist, sollte sie in öffentlichen Membern nicht verwendet werden. Sie kann intern verwendet werden.
Copyright für einzelne Teile 2005 Microsoft Corporation. Alle Rechte vorbehalten.
Copyright für einzelne Teile Addison-Wesley Corporation. Alle Rechte vorbehalten.
Weitere Informationen zu Entwurfsrichtlinien finden Sie unter „Framework-Entwurfs-Richtlinien: Idiome, Konventionen und Muster für wiederverwendbare .NET-Bibliotheken von Krzysztof Cwalina“ book und Brad Abrams, veröffentlicht von Addison-Wesley, 2005.