ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Visual Studio 2017 RC
    dev/etc 2016. 12. 5. 00:11

    visual studio 2017 RC가 공개 되었다.


    설치화면

    오랫동안 변함없던 답답한 설치 화면이 metro ui로 시원하게 바뀌었다.

    .


    IDE

    시작화면 변경

    시작화면도 간지나게 변경 되었다.


    실행속도 향상

    실행속도가 50% 빨라졌다고 하는데 잘 모르겠다.

    RC버전이니 정식버전을 믿어보자.


    새 기능

    IntelliSense 필터링

    IntelliSene 목록 중 class, field , method 등으로 필터링 할 수 있게 되었다.  그닥 쓸모는 없어 보이지만 간지난다.

    그리고 추가 플러그인 없이 코드 에디터에 블록이 라인도  표시해준다.


    리펙토링 기능 강화

    이전 버전에 비해 리펙토링 기능이 강화 되었다.

    • 변수 inline 이동
    • 이니셜라이저로 개체초기화 단순화
    • null 병합 연산자로 null 검사와 throw식 간소화

    하지만 리펙토링은 intellij 따라오려면 아직 멀었다.


    C# 7.0

    위에 있는거 다 필요 없고 Visual Studio 2017과 함께라면  C# 7.0을 쓸 수 있다.


    Out variables

    out 출력 변수를 기존에는 아래와 같이 선언해야 했다.

    public void PrintCoordinates(Point p)
    {
        int x, y; // have to "predeclare"
        p.GetCoordinates(out x, out y);
        WriteLine($"({x}, {y})");
    }

    하지만 이제 for문에 int i=0하는것처럼 선언과 동시에 사용할 수 있게 되었다.

    public void PrintCoordinates(Point p)
    {
        p.GetCoordinates(out int x, out int y);
        WriteLine($"({x}, {y})");
    }


    Pattern matching

    Is-expressions with patterns

    기존의 is 연산자 우측에는 항상 데이터형이 나오지만 이제는 변수로도 가능하다. 좀더 유연해졌다.

    public void PrintStars(object o)
    {
        if (o is null) return;     // constant pattern "null"
        if (!(o is int i)) return; // type pattern "int i"
        WriteLine(new string('*', i));
    }

    Switch statements with patterns

    switch에서 모든 자료형의 비교가 가능해졌으며 패턴을 사용할 수도 있다.

    switch(shape)
    {
        case Circle c:
            WriteLine($"circle with radius {c.Radius}");
            break;
        case Rectangle s when (s.Length == s.Height):
            WriteLine($"{s.Length} x {s.Height} square");
            break;
        case Rectangle r:
            WriteLine($"{r.Length} x {r.Height} rectangle");
            break;
        default:
            WriteLine("<unknown shape>");
            break;
        case null:
            throw new ArgumentNullException(nameof(shape));
    }


    Tuples

    아~ 이건 진짜 레알 큰일이다.  

    이제  Tuple을 남발해도 될 때가 왔다.

    아래처럼 리턴형에 name을 지정해주고

    (string first, string middle, string last) LookupName(long id) // tuple return type
    {
        ... // retrieve first, middle and last from data storage
        return (first, middle, last); // tuple literal
    }

    이렇게 쓰면 된다. 

    var names = LookupName(id);
    WriteLine($"found {names.first} {names.last}.");

    지리지? 이제 여러개의 리턴 타입을 받기 위해 새로운 클래스나 구조체를 만들지 않아도 된다.


    Local functions

    function 내에 function을 정의할 수 있게 되었다.

    이전에는 Func와 Lamda를 이용해서 local function을 구현했었다.

    그러나 c# 7.0에서는 훨씬 직관적으로 변했으며 Func와 Lamda 조합과는 다르게 호출하는 곳보다 아래에 있어도 된다.

    이렇게 했던것이

    private int sum(int a,int b)

    {

    Func<int,int,int> LocalFunction=(c,d)=>

    {

    return c+d;

    }

    return LocalFunction(a,b);

    }

    이렇게 할 수 있다.  일단 호출부 아래에 있어도 된다는게 좋다.

    public int sum(int a, int b) { return LocalFunction(a,b);

    int LocalFunction(int c, int d)

    {

    return c+d;

    } }


    급 귀찮아 진다. 좀 더 있는데 자세한 사항은  여기서 보자.

    https://www.visualstudio.com/en-us/news/releasenotes/vs2017-relnotes

    https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/

    댓글