언어/C#

C# 속성 (Property) - 2

tsyang 2020. 12. 27. 17:26

익명 타입


 

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