티스토리 뷰

Windows 10&11

What is Cool about C# 6.0?

kaki104 2015. 6. 3. 16:37
반응형

What is Cool about C# 6.0?


윈도 10에만 정신이 팔려서 셈플 코드를 만들던 중 이상한 코드를 발견하였다.


Page page = frame?.Content as Page;


위의 코드 중간에 있는 ?. 란 코드인데..처음 보는 녀석이다. 저녀석의 정체를 밝히기 위해 수소문을 한 결과 C# 6.0에 새로 추가된 기능이라고 한다. 언제 소리소문도 없이 추가가 된 것인지..우훔

그래서, 참고 포스트를 기준으로 간단하게 살펴 보려고 한다.


C# 6.0을 사용하려면 Visual Studio 2015 RC 버전이 필요하다.

 

 

 

 

1. 참고

What is Cool about C# 6.0?

http://www.codeproject.com/Articles/880467/What-is-Cool-about-Csharp


Developer Productivity: What's New in C# 6

http://www.microsoftvirtualacademy.com/training-courses/developer-productivity-what-s-new-in-c-6



2. Null 체크 연산자


개발할 때 개발자를 괴롭히는 녀석 중에 하나인 Null!! 반드시 null이 아닐꺼야~하고 체크 않하고 넘어가면 어느날 문득 오류가 발생하는..매번 하자니 귀찮고, 않하자니 찝찝한.. 아마 이런 나의 바램을 알고 추가한 듯한 기능이다.


            var frame = this.DataContext as Frame;
            Page page = frame?.Content as Page;
            if (page?.GetType() != typeof(HomePage))
            {
                frame.Navigate(typeof(HomePage));
            }


처음에 frame에 DataContext를 Frame으로 반환한다. 여기서 DataContext가 Frame이 맞다면 frame에는 오브젝트가 들어가겠지만, null이거나 Frame이 아니라면 frame은 null 값을 가진다. 그러므로, 반드시 frame은 null을 체크를 해줘야 한다.


Page page = frame?.Content as Page;


그런데, frame 뒤에 ?. 를 붙임으로서 여러줄의 코딩을 간단하게 정리를 하게된다. 해석은 frame이 null이면 null반환, null이 아니면 Content 프로퍼티를 Page Type으로 반환


if (page?.GetType() != typeof(HomePage))


여기도 마음에 든다. page가 null이면 null, null이 아니면 GetType() 메소드 실행



3. 프로퍼티 자동 초기화


get만 가능한 프로퍼티의 경우 초기값을 입력하는 방법은..


public string Id { get; private set;}


생성자에서


Id = "0001";


뭐 대충 이렇게 사용했다. 약간 다른 방법도 있지만..음..그런데 이런 방법이 아닌 간단한 방법으로 초기값을 넣을 수 있다.


public string Id { get; } = "0001";



4. 함수와 메소드의 본문을 람다식으로 정의


함수나 메소드의 본문의 내용이 한줄인 경우에만 사용이 가능하다. 여러줄은 기존대로 사용하면 된다.


        private void Page_Loaded(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine("TestFunction Result: {0}", TestFunction("Hello C# 6.0 World!"));
        }

        private string TestFunction(string test) => test?.Length.ToString();


결과는..


TestFunction Result: 19


정상적으로 나왔을 것이라고 생각한다..쿨럭..



5. Static 클래스 사용가능


참고 포스트에 있는 내용은 File을 열기 위해서 ReadAllLines을 사용하고 싶은데..이 녀석이 File이라는 Static 클래스에 있는 녀석이라 namaspace만 추가해서 사용할 수 없었는데..이제는 사용할 수 있다..라는 것 같은데..

앱 만들 때 위와 같은 경우가 없어서... 자세한 설명은 생략



6. Dictionary 초기화 기능


기존에 사용하던 Dictionary에 초기값 입력하는 방법보다 개발자가 보기 쉽고, 이해하기 쉬운 코드를 사용할 수 있도록 변경되었다.


기존에 초기화 하던 방법


            var dic = new Dictionary<string, object>
            {
                {"textBlock1", new TextBlock { Text="sample1" } },
                {"textBlock2", new TextBlock { Text="sample2" } },
                {"textBlock3", new TextBlock { Text="sample3" } },
            };


새로운 초기화 방법

            var dic2 = new Dictionary<string, object>
            {
                ["textBlock1"] = new TextBlock { Text = "sample1" },
                ["textBlock2"] = new TextBlock { Text = "sample2" },
                ["textBlock3"] = new TextBlock { Text = "sample3" },

            };


기존 방법보다는 확실히 보기 편한 방법이네요


 

7. 문자열 Interpolation

개발하다가 많이 사용하는 내용 중에 문자열을 출력하는 것이 있다. Debug 창에 문자열을 출력하거나, 화면에 메시지를 출력하거나 하는 경우 들이다.

 

Debug를 예를 들어보면

 

Debug.WriteLine("text length1 : {0}", "kaki104".Length);

 

대략 위와 같이 사용했는데..이걸 좀더 편하게 사용하는 방법이다.

 

Debug.WriteLine($"text length2 : {"kaki104".Length}");

 

문자열 데이터가 1개라면 크게 편하지 않치만, 여러개의 데이터를 출력해야 하는 경우라면 확실히 편하고, 직관적으로 보인다.

 

 

8. 예외 필터

try ~ catch 문을 사용하면서 딱 내가 원하는 오류만 잡아 내고 싶은데..그게 쉽지 않아서..코드를 여러줄 추가해 주어야 한다.

그런데 이제는 when~이란 키워드를 이용해서 원하는 오류만을 찾아서 처리할 수 있다.

 


        {
            Debug.WriteLine("text length1 : {0}", "kaki104".Length);
            Debug.WriteLine($"text length2 : {"kaki104".Length}");

            CalculateN(10, 0);
            Console.ReadLine();
        }

        static void CalculateN(int x, int y)
        {
            try
            {
                int index = 10;
                int j = (x * index) / y;
            }
            catch (InvalidOperationException e) when (e.Message.Contains("unknown error"))
            {
                Console.WriteLine("Mail error 1:" + e.Message);
            }
        }

 

 

위와 같은 코드를 추가하면 오류가 발생했을 때 오류가 발생한 위치에서 예외가 발생한 것을 볼 수 있다. 

 

 

 

10. Async, Await를 try~catch 문에서 사용

 

try~catch 문에서 또하나의 문제점이 await를 이용한 메소드를 실행 할 수 없다는 것이다. 그래서, 이런 경우에도 이런 저런 코드를 추가해서 처리해야 했다.

 

이제는 catch에서도 await를 이용할 수 있다.

 

        static async void CalculateN(int x, int y)
        {
            try
            {
                int index = 10;
                int j = (x * index) / y;
            }
            catch (InvalidOperationException e) when (e.Message.Contains("unknown error"))
            {
                await LogAsync(e.Message);
            }
        }

        static async Task LogAsync(string message)
        {
            await Task.Delay(100);
            Debug.WriteLine($"Error message : {message}");
        }

반응형
댓글