프로그래밍 관련/C#
C# 메모. 크로스 스레드 문제
2019. 4. 9.윈폼에서 개발하다 보면 아래와 같은 오류에 부딪히게 될 때가 있다. 이러한 크로스 스레드(Cross-thread) 문제를 해결하는 방법은 주로 아래와 같이 3가지 방법이 있다. CheckForIllegalCrossThreadCalls를 통해 해결 System.Windows.Forms.Control.Invoke를 통해 해결 System.ComponentModel.BackgroundWorker를 통해 해결 CheckForIllegalCrossThreadCalls 가장 간단한 해결 방법이다. 아래와 같이 코드 한 줄만 작성하면, UI 스레드 외의 스레드를 통해 컨트롤의 Handle에 접근하는 경우를 잡아내지 않도록 만들 수 있다. CheckForIllegalCrossThreadCalls = true; 그러나 ..
C# 메모. 패턴 매칭(Pattern Matching)
2019. 4. 7.패턴이 있는 Is 표현식(Is-expressions with patterns)아래 예제에서는 상수 패턴(const pattern)과 타입 패턴(type pattern)을 사용한 표현식을 볼 수 있다. public void PrintStars(object o) { if (o is null) return; // 상수 패턴 "null" if (!(o is int i)) return; // 타입 패턴 "int i" WriteLine(new string('*', i)); } 위 예제를 보면 패턴 변수라는 녀석이 등장한다. 표현식 중간에서 패턴 변수를 선언할 수 있고, 자신을 둘러싸고 있는 블럭 내에서 사용할 수도 있는 것을 볼 수 있다. 전에 만나봤던 out 변수란 녀석과 비슷하다. 패턴을 Try로 시작하는 메서..
C# 메모. out 변수(Out variables)
2019. 4. 6.기존에는 out 매개변수를 통해 메서드를 호출하려면 먼저 변수를 넘겨주기 위해서 변수를 먼저 선언해야 했다. 보통 전달받는 메서드가 초기화하기 때문에, 이런 변수들을 넘겨주기 전에 초기화하지 않는다. 이와 같은 이유로, var를 사용해 변수를 선언하지 못하고 변수의 타입을 명시적으로 적어주어야만 했다. public void PrintCoordinates(Point p) { int x, y; // 미리 선언해야 함 p.GetCoordinates(out x, out y); WriteLine($"({x}, {y})"); } 하지만 C# 7.0에 와서는 out 변수라는 기능이 추가되면서, 전달인자를 넘겨줄 때 변수를 선언할 수 있게 되었다. public void PrintCoordinates(Point p) {..
C# 메모. 튜플(Tuple)
2019. 3. 16.튜플(Tuple)은 C# 7.0에서 추가된 기능이다. 이제 튜플을 통해서 두 개 이상의 값을 반환하는 메서드를 보다 깔끔하게, 효율적으로 구현할 수 있게 되었다. 기존에는 메소드에서 두 개 이상의 값을 반환하고 싶을 때는 아래와 같은 방법들을 이용했다.(1) out 매개변수 한정자를 통해서 여러 개의 값을 넘겨주는 방법 (비동기 메서드에서는 사용할 수 없음)(2) System.Tuple 형식을 통한 튜플 객체 할당 (튜플 객체를 따로 할당해야 하는 것도 그렇지만 코드가 길게 늘어짐)(3) 두 개 이상의 값을 반환해야 하는 메소드마다 전달을 위한 클래스/구조체를 따로 만들기 (필요 이상으로 코드 오버헤드가 생기게 됨)(4) dynamic 반환형을 통해 익명 타입(Anonymous types)의 객체를 반환..
C# 6.0의 새로운 기능
2019. 3. 10.C# 6.0에서는 어떤 기능들이 추가되었을까? 지금부터 새로 추가된 9가지의 기능들을 함께 살펴보도록 하자. using 정적 지시문(using static)기존에는 정적 메서드를 호출하거나 속성을 가져오기 위해서는 아래와 같이 클래스명과 메서드명 또는 속성명을 같이 적어주어야 했다. double result = Math.Sqrt(a); 그럼 여기에서 아래와 같은 문장을 추가하면 어떻게 될까? using static System.Math; 직접 예제를 보도록 하자. using static System.Math; namespace StaticUsingExample { class Program { static void Main(string[] args) { double a = 4; double result =..