Структура Pair<F, S>
В ряде случаев бывает удобно использовать небольшие структуры, не содержащие методов. Однако не всегда хочется видеть у себя в коде множество одинаковых структур, предназначенных, к примеру, лишь для возвращаемых значений каких-либо методов.
C#: | Select code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /// <summary> /// Шаблонная структура, предназначенная для совместного хранения 2 классов. /// </summary> /// <typeparam name="F">Тип 1-го класса.</typeparam> /// <typeparam name="S">Тип 2-го класса.</typeparam> public struct Pair<F, S> { public Pair(F first, S second) { First = first; Second = second; } public readonly F First; public readonly S Second; } |
Например, у вас есть метод M(p1, p2, p3, p4) и вы хотите, чтобы он возвращал результат в объектах типа A и B. Без использования каких-либо ухищрений, вы наверняка сделаете метод таким:
C#: | Select code |
public void M(P1 p1, P2 p2, P3 p3, P4 p4, out A a, out B b)
или таким:
C#: | Select code |
public A M(P1 p1, P2 p2, P3 p3, P4 p4, out B b)
или еще одним из множества некрасивых вариантов.
Некрасивость таких вариантов объявления метода можно сформулировать от обратного: «красивый» метод имеет только входные параметры и возвращает результат (единственный), как значение самого метода, таким образом даже при беглом взгляде на метод, всегда легко понять где входные параметры, а где выходные.
При помощи шаблонной пары, метод будет выглядеть так:
C#: | Select code |
public Pair<A, B> M(P1 p1, P2 p2, P3 p3, P4 p4) { .... return new Pair<A, B>(a, b); }
и его вызов можно будет назвать красивым:
C#: | Select code |
var result = M(p1, p2, p3, p4);
A a = result.First;
B b = result.Second;
Удачи!
Обсуждение на форуме: http://usings.ru/forum/viewtopic.php?t=4
Один ответ Оставить комментарий
Более полно поддержка кортежей реализована в библиотеке Lokad — http://abdullin.com/shared-libraries/