C# Language
Funkcje C # 4.0
Szukaj…
Opcjonalne parametry i nazwane argumenty
Możemy pominąć argument w wywołaniu, jeśli argument ten jest argumentem opcjonalnym Każdy argument opcjonalny ma własną wartość domyślną. Jeśli nie podamy wartości, przyjmie wartość domyślną. Wartość domyślna argumentu opcjonalnego musi być
- Stała ekspresja.
- Musi być typem wartości, takim jak enum lub struct.
- Musi być wyrażeniem domyślnej postaci (valueType)
Musi być ustawiony na końcu listy parametrów
Parametry metody z wartościami domyślnymi:
public void ExampleMethod(int required, string optValue = "test", int optNum = 42)
{
//...
}
Jak powiedział MSDN, nazwany argument,
Umożliwia przekazanie argumentu do funkcji poprzez powiązanie nazwy parametru. Nie ma potrzeby zapamiętywania pozycji parametrów, o której nie zawsze jesteśmy świadomi. Nie trzeba szukać kolejności parametrów na liście parametrów wywoływanej funkcji. Możemy podać parametr dla każdego argumentu według jego nazwy.
Nazwane argumenty:
// required = 3, optValue = "test", optNum = 4
ExampleMethod(3, optNum: 4);
// required = 2, optValue = "foo", optNum = 42
ExampleMethod(2, optValue: "foo");
// required = 6, optValue = "bar", optNum = 1
ExampleMethod(optNum: 1, optValue: "bar", required: 6);
Ograniczenie używania argumentu nazwanego
Nazwana specyfikacja argumentu musi pojawić się po podaniu wszystkich ustalonych argumentów.
Jeśli użyjesz nazwanego argumentu przed stałym argumentem, otrzymasz błąd czasu kompilacji w następujący sposób.
Nazwana specyfikacja argumentu musi pojawić się po podaniu wszystkich ustalonych argumentów
Zmienność
Ogólne interfejsy i delegaci mogą mieć parametry typu oznaczone jako kowariantne lub przeciwwariantne, używając odpowiednio słów kluczowych out
i in
. Deklaracje te są następnie przestrzegane w przypadku konwersji typów, zarówno domyślnych, jak i jawnych, a także zarówno w czasie kompilacji, jak i w czasie wykonywania.
Na przykład istniejący interfejs IEnumerable<T>
został ponownie zdefiniowany jako zmienna kowariantna:
interface IEnumerable<out T>
{
IEnumerator<T> GetEnumerator();
}
Istniejący interfejs IComparer został na nowo zdefiniowany jako sprzeczny:
public interface IComparer<in T>
{
int Compare(T x, T y);
}
Opcjonalne słowo kluczowe ref przy użyciu COM
Słowo kluczowe ref dla wywołujących metody jest teraz opcjonalne podczas wywoływania metod dostarczanych przez interfejsy COM. Biorąc pod uwagę metodę COM z podpisem
void Increment(ref int x);
wywołanie można teraz zapisać jako jedno z nich
Increment(0); // no need for "ref" or a place holder variable any more
Dynamiczne wyszukiwanie członków
Nowa dynamic
pseudo- dynamic
została wprowadzona do systemu typu C #. Jest to traktowane jako System.Object
, ale dodatkowo każdy dostęp do elementu (wywołanie metody, pole, właściwość lub dostęp do indeksatora lub wywołanie delegatu) lub zastosowanie operatora do wartości tego typu jest dozwolone bez jakiejkolwiek kontroli typu, a jego rozwiązanie jest odraczane do czasu wykonania. Jest to znane jako pisanie kaczek lub późne wiązanie. Na przykład:
// Returns the value of Length property or field of any object
int GetLength(dynamic obj)
{
return obj.Length;
}
GetLength("Hello, world"); // a string has a Length property,
GetLength(new int[] { 1, 2, 3 }); // and so does an array,
GetLength(42); // but not an integer - an exception will be thrown
// in GetLength method at run-time
W takim przypadku stosowany jest typ dynamiczny, aby uniknąć bardziej pełnego Odbicia. Nadal używa Reflection pod maską, ale zwykle jest szybszy dzięki buforowaniu.
Ta funkcja jest ukierunkowana przede wszystkim na interoperacyjność z dynamicznymi językami.
// Initialize the engine and execute a file
var runtime = ScriptRuntime.CreateFromConfiguration();
dynamic globals = runtime.Globals;
runtime.ExecuteFile("Calc.rb");
// Use Calc type from Ruby
dynamic calc = globals.Calc.@new();
calc.valueA = 1337;
calc.valueB = 666;
dynamic answer = calc.Calculate();
Typ dynamiczny ma zastosowania nawet w kodzie najczęściej statycznym, na przykład umożliwia podwójne wysyłanie bez implementacji wzorca gościa.