Workspace/C#
[C# 7] Tuple
Bombus
2023. 4. 6. 10:27
C# 7버젼대 부터 Tuple 형식으로 메서드 결과를 반환할 수 있다.
(int min, int max) FindMinMax(int[] input)
{
if (input is null || input.Length == 0)
{
throw new ArgumentException("Cannot find minimum and maximum of a null or empty array.");
}
var min = int.MaxValue;
var max = int.MinValue;
foreach (var i in input)
{
if (i < min)
min = i;
if (i > max)
max = i;
}
return (min, max);
}

메서드 반환뿐만 아니라 Linq, 쿼리, 제너릭에서도 모두 사용 가능하다.
특별히 이름을 지정해주지 않으면 필드는 Item1, Item2... 와 같이 네이밍된다.
이때 Tuple은 값형식이다.
| 필드 이름 지정
아래와 같이 튜플 초기화나 정의 부분에서 필드의 이름을 명시적으로 지정할 수 있다.
var t = (Sum: 4.5, Count: 3);
Console.WriteLine($"Sum of {t.Count} elements is {t.Sum}.");
(double Sum, int Count) d = (4.5, 3);
Console.WriteLine($"Sum of {d.Count} elements is {d.Sum}.");
| Tuple 참조형식과의 비교
구분
|
형식
|
변경가능 여부
|
데이터 멤버
|
System.ValueTuple
|
값
|
가능
|
필드
|
System.Tuple
|
참조
|
불가능
|
속성 (get)
|
| 무명형식과의 비교
이름
|
액세스 한정자
|
형식
|
커스텀 멤버 이름
|
분해 지원
|
식 트리 지원
|
무명 형식
|
internal
|
class
|
O
|
X
|
O
|
Tuple
|
public
|
class
|
X
|
X
|
O
|
Value Tuple
|
public
|
struct
|
O
|
O
|
X
|
Tuple 문서를 읽다가 무명 형식에 대해서도 보게 되었는데, 위 표를 보고 비교해서 알맞은 상황에 사용하면 될 것 같다.
// 간단한 사용법
var foo = new { Formatted = $"{date:MMM dd, yyyy hh:mm zzz}", date.Ticks };
// 컴파일러에서 아래와 같이 생성된다.
internal sealed class f__AnonymousType0
{
public string Formatted { get; }
public long Ticks { get; }
public f__AnonymousType0(string formatted, long ticks)
{
Formatted = formatted;
Ticks = ticks;
}
}
| 마치며
Tuple로 인해 데이터 요소를 간결하게 구문화하는 것이 가능해졌다. Tuple은 단순히 그룹화 하는데 그치지 않고 할당 및 분해, 비교 연산자 등 다양한 기능을 제공하는데, 암시적으로 형변환되거나 컴파일러가 유추하는 부분이 많아서 유의해서 사용할 필요가 있다.
| 참고
반응형