Глава.10 .Свойства
Console.WriteLine("Min={0}, Max={1}",
minmax.Item1, minmax.Item2); // Min=2, Max=6
}
Конечно, очень важно, чтобы и производитель, и потребитель типа
Tuple
имели
четкое представление о том, что будет возвращаться в свойствах
Item#
. С аноним-
ными типами свойства получают действительные имена на основе программного
кода, определяющего анонимный тип. С типами
Tuple
свойства получают их имена
автоматически, и вы не можете их изменить. К несчастью, эти имена не имеют на-
стоящего значения и смысла, а зависят от производителя и потребителя. Это также
ухудшает читабельность кода и удобство его сопровождения, так что вы должны
добавлять комментарии к коду, чтобы объяснить, что именно производитель/по-
требитель имеет в виду.
Компилятор может только подразумевать обобщенный тип во время вызова
обобщенного метода, а не тогда, когда вы вызываете конструктор. В силу этой при-
чины пространство имен
System
содержит статический необобщенный класс
Tuple
с набором статических методов
Create
, которые могут определять обобщенные
типы по аргументам. Этот класс действует как фабрика по производству объектов
типа
Tuple
и существует просто для упрощения вашего кода. Вот переписанная
с использованием статического класса
Tuple
версия метода
MinMax
:
// Возвращает минимум в Item1 и максимум в Item2
private static TupleMinMax(Int32 a, Int32 b) {
return Tuple.Create(Math.Min(a, b), Math.Max(a, b)); // Упрощенный
// синтаксис
}
Чтобы создать тип
Tuple
с более, чем восьмью элементами, передайте другой
объект
Tuple
в параметре
Rest
:
var t = Tuple.Create(0, 1, 2, 3, 4, 5, 6, Tuple.Create(7, 8));
Console.WriteLine("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}",
t.Item1, t.Item2, t.Item3, t.Item4, t.Item5, t.Item6, t.Item7,
t.Rest.Item1.Item1, t.Rest.Item1.Item2);
ПриМеЧание
Кроме.анонимных.и.кортежных.типов,.стоит.присмотреться.к.классу.System Dynamic
ExpandoObject.(определенному.в.сборке.System Core dll.assembly) .При.использова-
нии.этого.класса.с.динамическим.типом.C#.(о.котором.говорится.в.главе.5).появляется.
другой.способ.группировки.наборов.свойств.(пар.ключ-значение).вместе .Получен-
ный.в.результате.тип.не.обладает.безопасностью.типов.на.стадии.компиляции,.зато.
синтаксис.выглядит.отлично.(хотя.вы.лишаетесь.поддержки.IntelliSense),.а.объекты.
ExpandoObject.могут.передаваться.между.C#.и.такими.динамическими.языками,.как.
Python .Пример.кода.с.использованием.объекта.ExpandoObject:
dynamic e = new System.Dynamic.ExpandoObject();
e.x = 6; // Добавление свойства 'x' типа Int32
// со значением 6
279
Свойства.с.параметрами
e.y = "Jeff"; // Добавление свойства 'y' строкового типа
// со значением "Jeff"
e.z = null; // Добавление свойста 'z' объекта
// со значением null
// Просмотр всех свойств и других значений
foreach (var v in (IDictionary )e)
Console.WriteLine("Key={0}, V={1}", v.Key, v.Value);
// Удаление свойства 'x' и его значения
var d = (IDictionary)e;
d.Remove("x");
Do'stlaringiz bilan baham: |