Сегодня мы поговорим о другой новинке C# 4.0, которую я ждал много лет. В прошлом, ее отсутствие объяснялось архитектурным решением. Но, видимо, прагматизм победил и теперь у нас есть параметры по умолчанию. Чтобы сделать их еще более полезными они добавили к ним именованые параметры. Мы обсудим их через пару минут, а сейчас займемся параметрами по умолчанию.
Предположим, что у нас есть такой класс:
А что случится, если мы опустим значение val2 в вызове метода, показаном выше? Тоесть мы хотим указать val1 и val3, но оставить значение по умолчанию для val2. Мы не можем сделать это так:
Вот вам еще одна интересная новая возможность C# 4.0 и еще один повод приглядываться к новой VS2010.
Перевод статьи: C# 4.0 New Features Part 2 — default and named parameters
Кросспост из моего блога
Предположим, что у нас есть такой класс:
- public class TestClass
- {
- public void PerformOperation(string val1, int val2, double val3)
- {
- Console.WriteLine("{0},{1},{2}", val1, val2, val3);
- }
- }
* This source code was highlighted with Source Code Highlighter.
Теперь мы можем инстанциировать его и вызвать метод:
- var testClass = new TestClass();
- testClass.PerformOperation("val", 10, 12.2);
* This source code was highlighted with Source Code Highlighter.
Но, что, если мы знаем «хорошие» значения параметров, которые используются чаще всего? До сего дня решением являлась перегрузка методов:
- public class TestClass
- {
- public void PerformOperation()
- {
- PerformOperation("val", 10, 12.2);
- }
-
- public void PerformOperation(string val1)
- {
- PerformOperation(val1, 10, 12.2);
- }
-
- public void PerformOperation(string val1, int val2)
- {
- PerformOperation(val1, val2, 12.2);
- }
-
- public void PerformOperation(string val1, int val2, double val3)
- {
- Console.WriteLine("{0},{1},{2}", val1, val2, val3);
- }
- }
* This source code was highlighted with Source Code Highlighter.
Довольно длинно. Но C# 4.0 дает нам лучшее решение:
- public class TestClass
- {
- public void PerformOperation(string val1 = "val", int val2 = 10, double val3 = 12.2)
- {
- Console.WriteLine("{0},{1},{2}", val1, val2, val3);
- }
- }
* This source code was highlighted with Source Code Highlighter.
Насколько это чище, а? Как же нам теперь вызывать этот метод? Да точно так же, если бы это была перегрузка:
- var testClass = new TestClass();
- testClass.PerformOperation("val", 10);
* This source code was highlighted with Source Code Highlighter.
Очень хорошо. Третий параметр в этом вызове приравнен к 12.2 по умолчанию. Теперь VB.NET разработчики перестанут смеятся над нами. Более того, параметры по умолчанию распространяются и на конструкторы:
- public class TestClass
- {
- public TestClass(string someValue = "testValue")
- {
- }
-
- public void PerformOperation(string val1 = "val", int val2 = 10, double val3 = 12.2)
- {
- Console.WriteLine("{0},{1},{2}", val1, val2, val3);
- }
- }
* This source code was highlighted with Source Code Highlighter.
Больше никаких многократных перегрузок конструкторов!А что случится, если мы опустим значение val2 в вызове метода, показаном выше? Тоесть мы хотим указать val1 и val3, но оставить значение по умолчанию для val2. Мы не можем сделать это так:
- var testClass = new TestClass();
- testClass.PerformOperation("val", 10.2);
* This source code was highlighted with Source Code Highlighter.
Этот код не скомпилируется, так как 10.2 не может быть приведено к int — здесь C# пытается оставить по умолчанию третий параметр, а не второй, как нам нужно. Итак, какой выход у нас есть? Мы можем использовать именованые параметры. Они состоят из указания имени параметра, двоеточия и значения, которое мы передаем. Тоесть вызов будет выглядеть так:
- var testClass = new TestClass();
- testClass.PerformOperation("val", val3: 10.2);
* This source code was highlighted with Source Code Highlighter.
Довольно аккуратно, но меня смущает тот факт, что теперь смена имени параметра будет нести такие кардинальные последствия. Я думаю только время покажет насколько это удобно в разработке больших приложений. Хотя, люди, работающие с другими языками живут с этим уже много лет.Вот вам еще одна интересная новая возможность C# 4.0 и еще один повод приглядываться к новой VS2010.
Перевод статьи: C# 4.0 New Features Part 2 — default and named parameters
Кросспост из моего блога