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 |
private object GetAnonymousObject() { return new {Foo = "bar", Baz = 123}; } private void AnotherMethod() { var obj = GetAnonymousObject(); Console.WriteLine(obj.Foo); // compiler error :( } |
물론 유용하긴 하지만, 저는 일반적으로 익명으로 처리합니다. 객체 이러한 이유로 사용 중입니다.
이것이 C# 튜플과 무슨 관련이 있나요?
저는 C# 튜플을 익명 타입을 반환하지만 더 풍부한 정보를 제공하는 방법으로 생각합니다. 실제로 클래스를 정의하지 않고도 즉석에서 "클래스"를 생성할 수 있는 방법입니다. 튜플의 구문은 쉼표로 구분된 유형과 이름 목록 주위에 괄호를 넣는 것입니다. 튜플 리터럴은 쉼표로 구분된 리터럴 목록을 괄호로 묶은 것입니다. 예를 들어
|
1 2 3 4 |
(string FirstName, string LastName) myTuple = ("Matt", "Groves"); Console.WriteLine(myTuple.FirstName); // no compiler error :) Console.WriteLine(myTuple.LastName); // no compiler error :) |
참고: 현재 저는 튜플 프로퍼티에 파스칼 케이스를 선호합니다. 이것이 공식적인 지침인지는 모르겠지만 제게는 옳다고 '느껴집니다'.
작동 중인 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 class BucketHelper { private readonly IBucket _bucket; public BucketHelper(IBucket bucket) { _bucket = bucket; } public (string Key, T obj) GetTuple<T>(string key) { var doc = _bucket.Get<T>(key); return (doc.Id, doc.Value); } public void InsertTuple<T>((string Key, T obj) tuple) { _bucket.Insert(new Document<T> { Id = tuple.Key, Content = tuple.obj }); } } |
이 헬퍼를 인스턴스화하려면, 이 헬퍼에 IBucket 를 생성자에 추가합니다.
반환 유형으로 튜플
그런 다음 GetTuple 메서드를 사용하여 Couchbase에서 문서를 튜플로 가져올 수 있습니다.
|
1 2 3 |
var bucketHelper = new BucketHelper(bucket); (string key, Film film) fightClub = bucketHelper.GetTuple<Film>("film-001"); |
튜플은 문자열(문서 키)과 지정한 유형의 객체로 구성됩니다. 문서 콘텐츠는 JSON이며 .NET SDK에 의해 C# 객체로 직렬화됩니다.
또한 튜플 프로퍼티의 이름이 일치할 필요는 없다는 점에 유의하세요. 저는 객체 in 버킷헬퍼 하지만 저는 영화 내가 전화했을 때 GetTuple<영화. 물론 유형은 일치해야 합니다.
매개변수 유형으로 튜플
다른 방법으로 튜플을 매개 변수로 전달할 수도 있습니다. 삽입튜플.
|
1 2 3 |
string key = Guid.NewGuid().ToString(); Film randomFilm = GenerateRandomFilm(); bucketHelper.InsertTuple((key, randomFilm)); |
그리고 생성 랜덤 필름 메서드는 필름 객체를 임의의 값으로 설정합니다( 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 전반에 대한 자세한 정보를 확인하세요.