익명 타입
var anon = new { Name = "Yang", Year = 1993 };
Console.WriteLine($"Name : {anon.Name}, Year = {anon.Year}");
위와 같은 방법으로 익명 타입을 생성할 수 있다. 저렇게 익명 타입을 생성하면 컴파일러가 알아서 이름을 붙여주며, var을 이용해서 타입을 유추할 수 있게 된다.
컴파일러가 하는 일을 더 자세히 보면, 각각의 표현식으로 부터 정확한 타입을 유추하여 private readonly 필드를 만들고, 각각의 속성을 정의하며 주어진 값들을 받을 수 있는 생성자를 정의한다. 추가적으로 Equals, GetHashCode, ToString 메서드까지 제정의한다.
다음과 같이 이름을 유추하거나, 배열로도 사용할 수 있다.
string Name = "Yang";
DateTime birth = DateTime.Now;
// 알아서 string 타입의 Name이란 변수를 정의한 뒤 "Yang"을 할당. int 타입의 Year이란 변수를 정의한 뒤, 값 할당
var anon = new { Name, birth.Year };
//배열도 가능
var peopel = new[]
{
anon,
new {Name = "Yang2", Year = 1000 },
new {Name = "Yang3", Year = 1001 },
};
그럼 이걸 왜쓰냐?
LINQ 구문과 많이 쓴다고 한다.
var query = from people in GetPeople()
where people.year > 2000
select new { Name = people.name, Year = people.year }; //익명타입을 만든다.
foreach(var person in query)
Console.WriteLine($"Name : {person.Name}, Year : {person.Year}");
음.. 편한거 같기도 하다
어쨋든 익명 타입의 인스턴스들은 메서드 바깥으로 가져갈 수 없으며 익명 타입의 인스턴스를 취하는 메서드를 정의할 수도 없다. 왜냐면 익명 타입의 이름을 알 방법이 없기 때문이다. (익명 타입의 참조 반환도 마찬가지) 만약 메서드 밖으로 이런 타입을 가져가고 싶다면 다음에서 설명할 튜플을 써야 한다.
튜플
private static Tuple<string , int> GetPersonInfo(Person p)
{
return new Tuple<string, int>(p.name, p.year);
}
public static void Main()
{
var randomInfo = GetPersonInfo(GetRandomPerson());
Console.WriteLine($"Random Person Info , Name : {randomInfo.Item1} Year : {randomInfo.Item2}");
}
이렇게 쓰는게 튜플인데, 익명 타입과 달리 item1, item2 라는 속성의 이름이 정의되어 있다.
private static Tuple<string, int> GetPersonInfoMoreSimple(Person p)
{
return Tuple.Create(p.name, p.year);
}
위와 같이 더 간단한게 쓸 수도 있다.
매개변수 없는 속성
C#에서는 인덱서라고 부른다. C#은 인덱서를 마치 배열같이 사용할 수 있도록 해준다. 달리 말하면 [] 연산자를 오버로딩하는 또 다른 방법이라고 할 수 있다.
class MyString
{
char[] str;
public char this[int index]
{
get { return str[index]; }
}
}
public static void Main()
{
var mystr = new MyString();
char chAtTwo = mystr[2];
}
그냥 this 붙여서 쓰면 됨. 매개변수 없는 속성과 마찬가지로 컴파일러가 get_, set_ 자동 생성해줌.
속성의 성능
어쩌피 JIT컴파일러가 인라인함. 그런데 디버그 빌드에서는 속도 느릴 수도 있음.
'언어 > C#' 카테고리의 다른 글
C# 제너릭 - 1 (0) | 2021.01.09 |
---|---|
C# 이벤트 (1) | 2021.01.02 |
C# 속성 (Property) - 1. 속성, 매개변수 없는 속성 (0) | 2020.12.20 |
C# 매개변수 (0) | 2020.12.13 |
C# - @ (verbatim identifier) (2) | 2020.12.07 |