Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / Конспект лекций (C#).pdf
Скачиваний:
864
Добавлен:
27.05.2015
Размер:
2.03 Mб
Скачать

3.5.2 Новое в версии C# 4.0

Начиная с версии C# 4.0 параметрам метода, конструктора или индексатора могут быть заданы значения по умолчанию. Это позволяет делать параметры необязательными. Для указания значения по умолчанию необходимо при описании параметра присвоить ему значение, например:

public class MyClass

{

public int Method(int a = 1, int b = 1, int c = 1)

{

return a * b * c;

}

}

 

 

 

MyClass cl = new MyClass();

 

 

int i1

= cl.Method(2, 3, 4); // i1

= 24

int i2

= cl.Method(5, 6);

// i2

= 30

int i3

= cl.Method(7);

// i3

= 7

int i4

= cl.Method();

// i4

= 1

Если в методе требуются обязательные и необязательные параметры, то в описании метода обязательные параметры должны указываться первыми, т.е. описание метода

public int Method(int a = 1, int b, int c = 1) {return a * b * c;}

будет недопустимым.

Введение для параметров значений по умолчанию может привести к сложностям при использовании перегрузки методов, например:

public class MyClass

{

public int Method(int a, int b = 1)

{

return a * b;

}

public double Method(int a, double b = 1.0)

{

return a * b;

}

}

 

MyClass cl = new MyClass();

 

int i = cl.Method(2, 3);

// i = 6

double d = cl.Method(2, 3.0); // d = 6.0

d = cl.Method(2);

// Неоднозначность

i = cl.Method(2);

// Неоднозначность

В строке d = cl.Method(2); возникает неоднозначность, т.к. компилятор не может определить, какой из перегруженных методов использовать. Изменение типа

54

возвращаемого значения для сужения диапазона возможных значений (i = cl.Method(2)) также не приведёт к устранению неоднозначности. В таких случаях, лучше не использовать значения по умолчанию в перегружаемых методах.

Ещё одним новшеством при работе с методами является возможность использовать имена параметров при вызове метода. Формат описания параметра при этом имеет вид:

<идентификатор параметра> : <значение>

Применение именованных параметров позволяет указывать их не в той последовательности, в которой они описаны в методе, например:

public class MyClass

{

public int Method(int a, int b)

{

return a - b;

}

}

 

 

 

MyClass cl = new MyClass();

 

 

int i1 = cl.Method(5, 3);

// i1

= 2

int i2 = cl.Method(a: 5, b: 3); // i2

= 2

int i3

= cl.Method(b: 5, a: 3); // i3

= -2

int i4

= cl.Method(5, b: 3);

// i4

= 2

int i5

= cl.Method(5, a: 3);

// Ошибка

Строка (int i5 = cl.Method(5, a: 3)) недопустима, т.к. в ней выполняется повторное присваивание значения параметру «a».

Именованные параметры могут применяться в комбинации с значениями по умолчанию, что позволяет указывать при вызове метода только требуемые параметры, например:

public class MyClass

{

public double Method(double a = 1.0, double b = 1.0, double c = 1.0)

{

return (a - b) / c;

}

}

MyClass cl = new MyClass();

double d1 = cl.Method(a: 2); // d1 = 1 double d2 = cl.Method(b: 2); // d2 = -1 double d3 = cl.Method(c: 2); // d3 = 0

55