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ć

  1. Stała ekspresja.
  2. Musi być typem wartości, takim jak enum lub struct.
  3. 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.

wprowadź opis zdjęcia tutaj

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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow