Поиск…


Необязательные параметры и именованные аргументы

Мы можем опустить аргумент в вызове, если этот аргумент является необязательным аргументом. Каждый необязательный аргумент имеет собственное значение по умолчанию. Оно будет принимать значение по умолчанию, если мы не укажем значение. Значение по умолчанию для необязательного аргумента должно быть

  1. Постоянное выражение.
  2. Должен быть тип значения, например enum или struct.
  3. Должно быть выражение формы default (valueType)

Он должен быть установлен в конце списка параметров

Параметры метода со значениями по умолчанию:

public void ExampleMethod(int required, string optValue = "test", int optNum = 42)
{
    //...
}

Как сказано в MSDN, именованный аргумент,

Позволяет передавать аргумент функции, связывая имя параметра. Нет необходимости запоминать позицию параметров, о которой мы не знаем всегда. Не нужно искать порядок параметров в списке параметров вызываемой функции. Мы можем указать параметр для каждого аргумента по его имени.

Именованные аргументы:

// 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);

Ограничение использования именованного аргумента

Именованная спецификация аргумента должна появиться после указания всех фиксированных аргументов.

Если вы используете именованный аргумент перед фиксированным аргументом, вы получите ошибку времени компиляции следующим образом.

введите описание изображения здесь

Именованная спецификация аргумента должна появляться после указания всех фиксированных аргументов

отклонение

Общие интерфейсы и делегаты могут иметь параметры своего типа, помеченные как ковариантные или контравариантные, используя ключевые слова out и in . Затем эти декларации учитываются для преобразований типов, как неявных, так и явных, и как время компиляции, так и время выполнения.

Например, существующий интерфейс IEnumerable<T> был переопределен как ковариантный:

interface IEnumerable<out T>
{
    IEnumerator<T> GetEnumerator();
}

Существующий интерфейс IComparer был переопределен как контравариантный:

public interface IComparer<in T>
{
    int Compare(T x, T y);
}

Необязательное ключевое слово ref при использовании COM

Ключевое слово ref для вызывающих методов теперь является необязательным при вызове методов, предоставляемых интерфейсами COM. Учитывая метод COM с подписью

void Increment(ref int x);

теперь вызов можно записать как либо

Increment(0); // no need for "ref" or a place holder variable any more

Динамический поиск элементов

В систему типов C # вводится новая псевдо- dynamic . Он рассматривается как System.Object , но кроме того, любой членский доступ (вызов метода, поле, свойство или доступ индексатора или вызов делегата) или приложение оператора по значению такого типа разрешено без проверки типа, и его разрешение откладывается до времени выполнения. Это называется утиным типом или поздним связыванием. Например:

// 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

В этом случае динамический тип используется, чтобы избежать более подробного отражения. Он по-прежнему использует Reflection под капотом, но обычно это происходит быстрее благодаря кешированию.

Эта функция в первую очередь ориентирована на взаимодействие с динамическими языками.

// 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();

Динамический тип имеет приложения даже в основном статически типизированном коде, например, делает двойную отправку возможной без реализации шаблона посетителя.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow