C# 튜플은 C# 7의 새로운 기능입니다. C# 튜플이 어떻게 작동하는지에 대한 기본 사항을 보여드리겠습니다. 또한 튜플이 실제로 작동하는 모습을 보여드리기 위해 약간의 카우치베이스도 섞어보겠습니다. 하지만 원하지 않는다면 카우치베이스 설치 튜플을 가지고 노는 것만으로도 충분히 따라할 수 있으니 걱정하지 마세요.
그리고 이 블로그 게시물에 사용한 소스 코드는 깃허브에서 확인할 수 있습니다. 를 통해 체험해 볼 수 있습니다.
참고: C#를 한동안 사용했다면, 다음과 같은 내용을 기억하실 수 있습니다. .NET 4에 도입된 튜플 클래스. 해당 클래스는 여전히 존재하지만 C#의 새로운 튜플 기능과는 다릅니다.
C# 튜플이란 무엇인가요?
'튜플'은 요소의 목록에 불과한 수학적 개념의 이름입니다. LISP 언어 계열에서 코딩은 거의 전적으로 모든 것이 목록이라는 개념을 중심으로 구축됩니다. C#는 함수형 프로그래밍 세계에서 아이디어의 핵심을 다시 한 번 차용하여 비함수형 언어에 통합합니다. 따라서 C# 튜플을 얻게 됩니다( 매즈 토르게르센의 오리지널 C# 튜플 제안서 를 참조하세요.)
익명 유형을 기억하시나요?
하지만 간단하게 설명하기 위해 이미 익숙한 익명 유형인 C#를 예로 들어보겠습니다. 검토를 위해 유형을 지정하지 않고 새 객체를 인스턴스화할 수 있습니다:
|
1 |
var myObject = new { Foo = "bar", Baz = 123 }; |
무대 뒤에서는 실제로 는 베이스에서 상속하는 유형 개체 유형을 사용할 수도 있지만 일반적으로는 객체의 유형이 아닌 객체만 다룹니다.
또한 메서드에서 익명 타입을 반환하거나 익명 타입을 매개변수로 전달할 때 타입 정보를 손실하지 않고는 프로세스에서 익명 타입을 반환할 수 없습니다.
|
1 2 3 4 5 6 7 8 9 10 |
비공개 객체 익명 객체 가져오기() { 반환 new {Foo = "bar", Baz = 123}; } 비공개 void AnotherMethod() { var 객체 = 익명 객체 가져오기(); 콘솔.WriteLine(객체.Foo); // 컴파일러 오류 :( } |
물론 유용하긴 하지만, 저는 일반적으로 익명으로 처리합니다. 객체 이러한 이유로 사용 중입니다.
이것이 C# 튜플과 무슨 관련이 있나요?
저는 C# 튜플을 익명 타입을 반환하지만 더 풍부한 정보를 제공하는 방법으로 생각합니다. 실제로 클래스를 정의하지 않고도 즉석에서 "클래스"를 생성할 수 있는 방법입니다. 튜플의 구문은 쉼표로 구분된 유형과 이름 목록 주위에 괄호를 넣는 것입니다. 튜플 리터럴은 쉼표로 구분된 리터럴 목록을 괄호로 묶은 것입니다. 예를 들어
|
1 2 3 4 |
(문자열 이름, 문자열 성) myTuple = ("매트", "Groves"); 콘솔.WriteLine(myTuple.이름); // 컴파일러 오류 없음 :) 콘솔.WriteLine(myTuple.성); // 컴파일러 오류 없음 :) |
참고: 현재 저는 튜플 프로퍼티에 파스칼 케이스를 선호합니다. 이것이 공식적인 지침인지는 모르겠지만 제게는 옳다고 '느껴집니다'.
작동 중인 C# 튜플
저는 Couchbase와 상호 작용하는 간단한 콘솔 앱에서 튜플을 작동시켰습니다.
나는 버킷헬퍼 클래스는 일반 카우치베이스에 비해 매우 단순한 외관입니다. IBucket. 이 클래스에는 키로 문서를 가져와서 튜플을 반환하는 메서드와 문서로 튜플을 삽입하는 메서드 두 가지가 있습니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public 클래스 버킷헬퍼 { 비공개 읽기 전용 IBucket _버킷; public 버킷헬퍼(IBucket 버킷) { _버킷 = 버킷; } public (문자열 키, T 객체) GetTuple<T>(문자열 키) { var doc = _버킷.Get<T>(키); 반환 (doc.Id, doc.가치); } public void 삽입튜플<T>((문자열 키, T 객체) 튜플) { _버킷.삽입(new 문서<T> { Id = 튜플.키, 콘텐츠 = 튜플.객체 }); } } |
이 헬퍼를 인스턴스화하려면, 이 헬퍼에 IBucket 를 생성자에 추가합니다.
반환 유형으로 튜플
그런 다음 GetTuple 메서드를 사용하여 Couchbase에서 문서를 튜플로 가져올 수 있습니다.
|
1 2 3 |
var 버킷 헬퍼 = new 버킷헬퍼(버킷); (문자열 키, 필름 영화) 싸움 클럽 = 버킷 헬퍼.GetTuple<필름>("film-001"); |
튜플은 문자열(문서 키)과 지정한 유형의 객체로 구성됩니다. 문서 콘텐츠는 JSON이며 .NET SDK에 의해 C# 객체로 직렬화됩니다.
또한 튜플 프로퍼티의 이름이 일치할 필요는 없다는 점에 유의하세요. 저는 객체 in 버킷헬퍼 하지만 저는 영화 내가 전화했을 때 GetTuple<영화. 물론 유형은 일치해야 합니다.
매개변수 유형으로 튜플
다른 방법으로 튜플을 매개 변수로 전달할 수도 있습니다. 삽입튜플.
|
1 2 3 |
문자열 키 = Guid.NewGuid().ToString(); 필름 랜덤 필름 = 생성 랜덤 필름(); 버킷 헬퍼.삽입튜플((키, 랜덤 필름)); |
그리고 생성 랜덤 필름 메서드는 필름 객체를 임의의 값으로 설정합니다( GitHub 소스 를 참조하세요.) 의 튜플 (문자열, 필름) 로 전달됩니다. 삽입튜플. NET SDK는 거기에서 가져와서 적절한 키/값이 포함된 문서를 삽입합니다.
콘솔 앱을 실행하면 다음과 같은 출력이 표시됩니다:

현재 Couchbase .NET SDK에는 직접 튜플이 지원되지 않으며, 튜플이 필요하지 않을 수도 있습니다. 이 코드는 단순히 C# 튜플을 시연하는 데 도움을 주기 위한 것입니다. 프로덕션 환경에서 BucketHelper를 그대로 사용하지 않는 것이 좋습니다.
TUH-ple 또는 TOO-ple?
교수님이 '투-플'이라고 발음했던 기억이 있어서 저도 그렇게 쓰고 있습니다. 'GIF'의 하드-G/소프트-G 논쟁처럼, 이 논쟁이 가장 중요하다고 생각하며 자신의 발음이 정답이라고 확신하는 사람들이 있을 것입니다. 하지만, 둘 다 허용됩니다..
튜플에 대해 궁금한 점이 있으면 기꺼이 도와드리겠습니다. 다음 주소로 문의하실 수도 있습니다. 트위터 @mgroves 또는 이메일을 보내주세요. matthew.groves@couchbase.com.
이 게시물에서 사용한 Couchbase .NET SDK에 대해 궁금한 점이 있으시면 카우치베이스 .NET 포럼. 또한 카우치베이스 개발자 포털 를 참조하여 .NET SDK 및 Couchbase 전반에 대한 자세한 정보를 확인하세요.