2012-11-30 3 views
105

튜플이 무엇인지 설명하고 현실 세계 시나리오에서이를 사용하는 방법을 알려 주시기 바랍니다. 이것이 내 코딩 경험을 풍부하게하는 방법을 알고 싶습니다.튜플을 언제, 어떻게 사용합니까?

답변

108

msdn article은 예제와 함께 매우 잘 설명합니다. "튜플은 특정 숫자와 요소 시퀀스가 ​​"인 데이터 구조입니다.

튜플은 일반적으로 4 가지 방법으로 사용됩니다

  1. 는 하나의 데이터 집합을 나타냅니다. 예를 들어 튜플은 데이터베이스 레코드를 나타내는 일 수 있으며 그 구성 요소는 레코드의 개별 필드 을 나타낼 수 있습니다.

  2. 데이터 세트에 쉽게 액세스하고 조작 할 수 있도록.

  3. 매개 변수 (C#) 또는 ByRef 매개 변수 (Visual Basic)를 사용하지 않고 메서드에서 여러 값을 반환하려면.

  4. 단일 매개 변수를 통해 메서드에 여러 값을 전달할 수 있습니다. 예제의 경우 Thread.Start(Object) 메서드에는 이라는 단일 매개 변수를 사용하여 스레드가 시작 시간에 실행하는 메서드에 하나의 값을 제공 할 수 있습니다. 메서드 으로 Tuple<T1, T2, T3> 개체를 제공하면 스레드의 시작 루틴에 개의 데이터 항목을 제공 할 수 있습니다.

68

튜플은 사용자 정의 클래스를 만들 필요없이 하나의 개체로 가능한 다른 유형의 여러 값을 결합 할 수 있습니다. 이것은 예를 들어 세 개의 관련 값을 리턴하지만 새 클래스를 작성하지 않으려는 메소드를 작성하려는 경우에 유용 할 수 있습니다.

일반적으로 클래스를 만들어야 각 속성에 유용한 이름을 지정할 수 있습니다. 속성이 Item1이라고 때문에 광범위하게 튜플을 사용하는 코드를 신속하게 읽을 수 없게됩니다 Item2, Item3, 등

+28

2 개의 값과 각각 다른 유형, 즉 문자열, int에 최대로 사용합니다. 그렇지 않으면 당신이 쓸 수있는 최악의 코드가되고있다. – Ondra

+3

클래스/모듈 내에서만 개인적으로 사용하는 것이 더 바람직 할 수 있습니다. 또한 복잡한 유형 ("고객", "직원"등)을 포함하는 튜플 사용법은 프리미티브보다 조금 더 간단 할 수 있습니다. Tuple 을 많이 사용하는 것보다 더 나쁜 것은 없습니다. –

16

튜플 클래스는 개발자가 특정 사용을 위해 특정 클래스를 정의하지 않음으로써 '신속하고 게으른'이 될 수 있습니다.

속성 이름은 Item1, Item2, Item3 ...이며 일부 경우 또는 문서가없는 경우 의미가 없습니다.

튜플 클래스에는 강력한 형식의 일반 매개 변수가 있습니다. Tuple 클래스의 사용자는 일반 매개 변수 유형에서 추론 할 수 있습니다.

+1

어쩌면 C# 7에서이 튜플 대신에 클래스/개체를 쉽게 만들 수 있었을 것입니다. –

32

튜플과 클래스의 차이점은 튜플에 속성 이름이 없다는 것입니다. 이것은 거의 결코 좋은 일이 아니며, 추상 수학 공식과 같이 인수가 무의미 할 때만 튜플을 사용합니다. 5,6,7 차원 이상의 추상 미적분은 좌표에 대한 튜플을 취할 수 있습니다.

+1

간단한 배열을 사용하는 것만으로는 충분하지 않은이 경우 (아마도 값의 유형이 같은 경우)? 튜플을 사용하면 몇 가지 이점이 있습니까? –

+0

유형은 쉽게 다를 수 있지만 IComparable 구현이 동질적인 경우에 이점이 될 수 있다고 생각합니다. 당신이 말했듯이, 나는 더 간단한 시나리오를 위해 배열을 사용하고자한다. – Kaido

+0

아주 좋은 대답입니다! –

20

튜플 유형에 대해 알아야 할 가장 중요한 사항입니다. 튜플은 클래스가 아니라 구조체입니다. 따라서 관리 힙에 할당됩니다. 할당 된 각 클래스 인스턴스는 가비지 수집의 부담을 가중시킵니다.

참고 : 속성 Item1, Item2 및 세터가 없습니다. 할당 할 수 없습니다. Tuple은 일단 메모리에 생성되면 변경되지 않습니다.

+1

_ "부담"_ - 가비지 수집 문제를 본 적이 있습니까? – Gusdor

+3

물론입니다! 네트워크 통신 처리 코드에 대해 생각해보십시오. 그것은 메모리를 할당하고 할당 해제하므로 GC가 2 분마다 실행되고 완료하는 데 몇 초가 걸릴 수 있습니다. 하류의 데이터가 실시간으로 해당 데이터에 의존한다면 이는 용인 할 수없는 일입니다. 운전 경로 앱과 같은 실시간 앱을 실행하는 휴대 기기와 같은 리소스 제약 장치가 또 다른 예입니다. – stuckintheshuck