유형 별칭을 이렇게도 사용할 수 있군요. 여러분은 어떻게 생각하세요?

글쓴이는 Dictionary<string, string>를 예로 들어서 유형 별칭을 이용해 그 의미를 명확하게 하고자 합니다.

// Create aliases
using UserId = string;
using ProjectId = string;

// Use the type aliases
// ✅ It's clear that the first string is a UserId and the second string is a ProjectId
_ = new Dictionary<UserId, ProjectId>();

이 방식이 거추장스러워 보이는지, 아니면 의미 있어 보이는지 어떻게 생각하시나요?


6개의 좋아요

나쁘진 않은거 같은데…

안그래도 네이밍할 때 이름 모잘라서 저거까지 쓰는거 좀 부담이긴 하네요 ㅠㅠ

예를 들어 언급된 유형 별칭 생기면 아래와 같이 되는데…

using UserId = string;

class Message
{
   UserId UserId { get }
}
5개의 좋아요

단일 타입에 대한 별칭은 호불호가 있어 보이긴 하는데
선택의 문제일거 같습니다.

이번에 업데이트 되면서 편했던건
tuple에 대해 별칭이 가능해 졌던거 입니다.
기존에는 안됐던 거고 쓸일이 은근 있어서 편했습니다.

다음 버전에 바라는 것은
using 에 대한 using 입니다.

using Chapter = List<string>;
using Book = List<Chapter>;

대충 요런 식으로 하는게 가능 하면 어떨까 싶네요.

4개의 좋아요

C++11에서 지원하는 별칭과 같네요
C++에서 typedef 대신 저런 식으로 쓰기도 합니다.

5개의 좋아요

저라면 Strongly-Type 인 객체를 record 한정자 사용해서 선언하겠습니다.

저런걸 한 파일 내에서만 일어나는게 아니고 여러 파일에서 매번 넣어줘야하는거 자체도

또 하나의 보일러플레이트 아닌가 싶습니다 ㅋㅋㅋㅋ

public record UserId
{
    public required string Value { get; init; }
}
public record ProjectId
{
    public required string Value { get; init; }
}
4개의 좋아요

저도 C에서 하던 그 모습이 생각나는걸요 ㅠㅠ
차라리 저렇게 쓴다치면
Dictionary<TKey,Tvalue>가 아니라
List<(string userId, string projectId)가 더 나아보이고
@BOBx5 님께서 언급한 Record나,
@code 님께서 말씀해주신 tuple이 나아보입니다.

3개의 좋아요

그라목손님 말씀대로 C++에서 많이 쓰는 방식인데요. C++자체적으로 지원하는 것들이 보통 접미사로 _t를 붙입니다. (ex: int8_t, int32_t, uint8_t, uint32_t,… )

사용해 본 바로는 자주 쓰는 것들일 경우 쓸만합니다.
물론 저도 접미사를 붙이죠.
한눈에 알아볼 수 있다면 나쁘지 않다고 생각 합니다.

4개의 좋아요

주제와 상관은 없는데 record 기본 생성자 대신 속성으로 예시를 표현했는지 궁금합니다. 특별한 이유가 없거나 있다면 그 이유를 알 수 있을까요?

2개의 좋아요

예전에 이렇게 사용해본적이 있었는데, 위 예시의 경우, IDE에서 모든 string이 UserId로 표시되길래 지웠습니다…

4개의 좋아요

형식 타입을 매번 새로 지정해야 하는 delegate (특히 Action이나 Func 처럼 받는 인자 수 자체가 많고 다양한 타입)나 Tuple 같은 타입에 효과적인 수단… 이긴 한데, C/C++의 typedef나 #define처럼 프로젝트 전체에 걸쳐 쓸 수 있는 것은 아니다보니 개인적으로는 좀 애매하다고 생각하는 편입니다.

의견을 달다가 생각나서 global using으로 alias를 선언할 수 있던가? 해서 살펴보니 가능하군요 ㅎㅎ 다만 이것도 프로젝트 권역 밖으로 넘어가면 유지가 안되는 정보긴 합니다만, 그래도 global using이 나오기 전에는 기껏해야 파일 안에서밖에 쓰임새가 없어서 애매하다고 생각했는데 이제 쓰임새가 좀 생긴 것 같습니다 ㅎㅎ

(아, 이것도 우회책이라면 우회책이긴 하겠네요. 여러 프로젝트에 걸쳐 유효하게 만드는 방법으로 Shared Project가 있긴 하겠습니다. 다만 이것도 C# 10 이상을 지원하는 닷넷 프로젝트 간에만 허용되는 부분일거고, 닷넷 프레임워크 프로젝트 쪽에서는 nullable 타입을 강제 주입할 떄처럼 컴파일러 버전을 강제로 높이는 방식으로 처리가 가능할지는 시험해보진 않았습니다.)

예:

global using Sample = System;
3개의 좋아요