목록전체 글 (247)
방프리
1. 취소 요청 실행CancellationTokenSource 형식은 CancellationToken의 공급원이며 이 형식만 취소 요청에 대응이 가능하다.또한 다른 CancellationTokenSource와 독립적이다. 코드를 취소할 때 거의 항상 경합 조건이 발생한다.void IssueCancelRequest(){ using var cts = new CancellationTokenSource(); var task = CancelableMethodAsync(cts.Token); cts.Cancel();} 2. 폴링으로 취소 요청에 대응함수 안에 처리 루프가 있을 때는 취소 여부를 주기적으로 확인할 수 밖에 없기에 실행속도가 빠르다면 속도를 어느 정도 조절해가며 성능을 측정해야 한..
1. 불변 스택과 불변 큐기본 스택과 큐와 성능을 동일하나 컬렉션을 자주 업데이트를 해야한다면 기본 스택과 큐가 더 빠르다. 단, 사용 시 하단의 내용을 알고 있어야 한다.불변 컬렉션의 인스턴스는 절대 바뀌지 않는다.스레드로부터 안전하다불변 컬렉션을 변경하는 메서드를 호출하면 변경한 내용을 반영한 새로운 컬렉션을 반환한다.스렏드 간 통신에 사용해서는 안된다. 생산자/소비자 큐가 훨씬 좋다. 2. 불변 리스트불변 리스트는 일반적인 List와 달리 불변 리스트의 인스턴스끼리 최대한 많은 메모리를 공유할 수 있게 내부적으로 이진트리로 구현되어 있다. 그러기에 대부분의 소요시간이 O(log N)이기에 foreach를 적극 활용해야 한다.ImmutableList는 그다지 선호되지 않는다. 사용 시 잘 확인해볼 것..
1. 'Async' 메서드와 'Completed' 이벤트용 비동기 래퍼Async로 끝나는 메서드와 Completed로 끝나는 이벤트를 사용하는 패턴을 이벤트 기반 비동기 패턴 (EAP, Event-based Asynchronous Pattern)이라고 한다. 이 EAP가 작업 기반 비동기 패턴 (TAP, Task-based Asynchronuous Pattern)을 따를 수 있게 Task를 반환하는 메서드로 감싸려 한다.public static Task DownloadStringTaskAsync(this WebClient client, Uri address){ var tcs = new TaskCompletionSource(); DownloadStringCompletedEventHa..
Item 48 : 가장 인기 있는 답이 아닌 최고의 답을 찾으라커뮤니티가 커짐으로써 문제를 해결해 나아가는 답이 이전 버전들에서 사용되던 답일 수 있다. 인기 있는 답이 새로운 기술을 적용한 가장 최신의 기술이 아닐 수 있기에 필자는 다음의 할일을 명시하였다.1. 답을 검색할 대 가장 인기 있는 답이 아닌 최신 C# 언어의 기능을 활용한 최고의 답을 찾는다.2. 최고의 답을 찾았다면 그 답을 지지해야 한다3. 웹페이지 수정할 수 있는 경우라면 가장 있기 있는 답을 수정해서 최신의 답을 살펴볼 수 있도록 만들자4. 자신의 코드를 수정할 때마다 더 나은 코드로 만드려고 노력하자Item 49 : 명세와 코드 향상에 기여하라깃허브에 공개된 .NET 언어 플랫폼인 로슬린과 C# 언어 설계를 뜻하는 CSharpL..
Item 47 : Public API에서는 동적 객체 사용을 최소화하라dynamic 객체는 건드리는 모든 것을 동적으로 만들어버리기에 사용 시 매우 주의해야 한다. 작업의 대상이 되는 매개 변수 중 하나라도 dynamic이라면 그 결과도 dynamic이 된다. 또한 메서드가 동적 객체를 반환하면 그 객체를 사용하는 모든 것이 동적 객체가 된다.C#은 기본적으로 정적 타입을 선호하며 일부 영역에 동적 타이핑을 적용한다는 점을 반드시 알고 있어야 한다. 만약 주 타이핑 방식이 동적으로만 이루어진다면 언어 선택에 대한 의구심을 가질 필요가 있다. 동적 프로그래밍은 취지는 좋으나 특성상 런타임에 리소스를 많이 사용해야 한다는 점을 알고 있어야 한다. 또한 public 인터페이스에서는 가능한 제외되어야 한다. 동..
Item 43 : 동적 타이핑의 장단점을 이해하라dynamic 타입은 '런타임에 바인딩되는 System.Object'.라고 볼 수 있다. 따라서 컴파일타임에 dynamic 타입의 변수는 System.Object에 정의된 메서드만 가지고 있다. 런타임 시 객체의 타입을 확인하고, 수행할 메서드가 지원되는지 확인한다. 이 방식을 덕 타이핑이라고 부른다. 이 방식은 특별히 인터페이스를 선언하거나, 커파일타임 타입 연산을 제공할 필요가 없다. 동적 타이핑은 타입에 대한 대처를 유연하게 할 수 있지만 타입 안정성을 고려하지 않으며 컴파일러가 도와줄 수 있는 범위가 한정적이기에 오류를 런타임에 찾을 수 있다는 단점이 있다.표현식 트리는 런타임에 코드를 구성하는 방법 중 하나인데 System.Linq.Expressi..
Item 46 : 표현식 API의 사용법을 익혀두라C#에 LINQ와 동적 지원 기능이 추가되면서 표현식과 표현식 트리를 사용해 동적 프로그래밍이 가능하다.표현식은 코드처럼 보이며 많은 경우 델리게이트로 컴파일하여 사용한다.표현식을 사용하게되면 여러 제약조건으로 메서드를 사용할 때 코드량을 줄이면서 유연하게 사용이 가능하다.public TResult CallInterface(Expression> op){ var exp = op.Body as MethodCallExpression; var methodName = exp.Method.Name; var methodInfo = exp.Method; var allParameters = from element in exp.Arguments ..
Item 45 : 데이터 주도 동적 타입에는 DynamicObject나 IDynamicMetaObjectProvider를 사용하라동적 프로그래밍의 큰 장점 하나는 런타임에 public 인터페이스가 바뀌는 타입을 만들 수 있다는 것이다. C#에서는 dynamic과 System.Dynamic.DynamicObject 베이스 클래스 그리고 System.Dynamic.IDynamicMetaObjectProvider 인터페이스를 통해 동적 능력을 갖춘 고유의 타입을 만들 수 있다.동적 능력을 가지는 타입을 만드는 다음과 같다.1. System.Dynamic.DynamicObject 상속- 가장 구현이 쉬운 방법 이 타입은 IDynamicMetaObjectProvider 인터페이스를 구현한 중첩 private 클래..