Обратимся сначала к простому примеру.
// Простой пример, демонстрирующий применение инициализаторов объектов.
using System;
class MyClass {
public int Count;
public string Str;
}
class ObjInitDemo {
static void Main() {
// Сконструировать объект типа MyClass, используя инициализаторы объектов.
MyClass obj = new MyClass {
Count = 100, Str = "Тестирование"
};
Console.WriteLine(obj.Count + " " + obj.Str);
}
}
Выполнение этого кода дает следующий результат.
100 Тестирование
Как показывает результат выполнения приведенного выше кода, переменная экземпляра obj.Count
инициализирована значением 100, а переменная экземпляра obj.Str
— символьной строкой "Тестирование". Но обратите внимание на то, что в классе MyClass
отсутствуют явно определяемые конструкторы и не используется обычный синтаксис конструкторов. Вместо этого объект obj
класса MyClass
создается с помощью следующей строки кода.
MyClass obj = new MyClass { Count = 100, Str = "Тестирование" };
В этой строке кода имена полей указываются явно вместе с их первоначальными значениями. Это приводит к тому, что сначала конструируется экземпляр объекта типа MyClass
(с помощью неявно вызываемого по умолчанию конструктора), а затем задаются первоначальные значения переменных Count и Str
данного экземпляра.
Следует особо подчеркнуть, что порядок указания инициализаторов особого значения не имеет. Например, объект obj
можно было бы инициализировать и так, как показано ниже.
MyClass obj = new MyClass { Str = "Тестирование", Count = 100 };
В этой строке кода инициализация переменной экземпляра Str
предшествует инициализации переменной экземпляра Count
, а в приведенном выше коде все происходило наоборот. Но в любом случае результат получается одинаковым.
Ниже приведена общая форма синтаксиса инициализации объектов:
new
где
Инициализаторы объектов обычно не используются в именованных классах, как, например, в представленном выше классе MyClass
, хотя это вполне допустимо. Вообще, при обращении с именованными классами используется синтаксис вызова обычного конструктора. И, как упоминалось выше, инициализаторы объектов применяются в основном в анонимных типах, формируемых в LINQ-выражениях.
Необязательные аргументы
В версии C# 4.0 внедрено новое средство, повышающее удобство указания аргументов при вызове метода. Это средство называется
Данное значение будет использоваться по умолчанию в том случае, если для параметра не указан соответствующий аргумент при вызове метода. Следовательно, указывать аргумент для такого параметра не обязательно. Необязательные аргументы позволяют упростить вызов методов, где к некоторым параметрам применяются аргументы, выбираемые по умолчанию. Их можно также использовать в качестве "сокращенной" формы перегрузки методов.
Применение необязательного аргумента разрешается при создании
static void OptArgMeth(int alpha, int beta=10, int gamma = 20) {
В этой строке кода объявляются два необязательных параметра: beta
и gamma
, причем параметру beta
по умолчанию присваивается значение 10, а параметру gamma
— значение 20. Эти значения используются по умолчанию, если для данных параметров не указываются аргументы при вызове метода. Следует также иметь в виду, что параметр alpha
не является необязательным. Напротив, это обычный параметр, для которого всегда нужно указывать аргумент.
Принимая во внимание приведенное выше объявление метода OptArgMeth(), последний можно вызвать следующими способами.
// Передать все аргументы явным образом.
OptArgMeth(1, 2, 3);