
아이템 1: 접근 가능한 데이터 멤버 대신 속성을 사용하라 c#에서 기본 제공하는 속성은 많이 보완되면서 더 풍부한 기능들이 생겼다. 예를들어 게터(getter)와 세터(setter)의 접근 제한을 다르게 설정할 수 있다. 자동 속성을 사용하면 데이터 멤버를 명시

빌 와그너, ⌜More Effective C# 2판⌟, 김완섭 옮김, 한빛미디어, 2019 이 포스팅은 ⌜More Effective C# 2판⌟의 내용을 기반으로 작성되었습니다. 아이템 2: 변경 가능한 데이터에는 암묵적 속성을 사용하는 것이 낫다. 속성 접근자를

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*변경 불가능한 타입은 한 번 생성된 후에는 그 값을 변경할 수 없는 타입을 말한다.변경 불가능한 타입은 본질적으로 여러 스레드가 동일한 콘텐츠에 접근해도 안전하며 호출자 측

빌 와그너, ⌜More Effective C# 2판⌟, 김완섭 옮김, 한빛미디어, 2019 이 포스팅은 ⌜More Effective C# 2판⌟의 내용을 기반으로 작성되었습니다. 아이템 4: 값 타입과 참조 타입을 구분하라

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*.NET은 기본적으로 모든 객체를 0으로 초기화 한다. 따라서 0이 타입의 기본이 되도록 설계하는게 좋다.열거형(enum)은 반드시 0을 유효한 값으로 선언해야 한다.열거형

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*속성은 외부에서는 수동적인 데이터 요소처럼 보이지만 그 내부는 메소드로 구현된다.이런 특징 때문에 사용자의 데이터처럼 동작할거라는 기대와는 다르게 동작하는 속성을 생성할 가

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*작성 예시아래와 같이 작성하면, 컴파일러는 내부적으로 2개의 읽기 전용 public 속성 X, Y를 갖는 sealed 클래스로 작성한다.장점컴파일러가 코드를 작성하게 두는

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*튜플과 익명타입 이 두 경량 타입을 메서드의 매개변수, 반환값, 속성 타입으로 사용하려면 특수한 기법을 익혀야 한다.튜플을 반환값의 타입을 정의하는 용도로 활용하는 예메서드

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*C\`\`\`cspublic static bool ReferenceEquals(object left, object right);public static bool Equals

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*GetHashCode()는 해시 기반 컬렉션에서 키의 해시값을 정의할 때 한곳에서만 사용된다.HashSet<T>과 Dictinary<K,V>과 같은 컨테이너들이다

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*견고한 API를 설계하기 위해서는 타입의 여러 측면을 고려해야 한다.해당 타입의 인스턴스를 어떻게 생성하도록 할 것인지타입이 제공하는 기능을 활용하기 위해서 어떤 메서드나

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*Cpublic 매개변수의 이름을 변경하면 호출 측의 코드를 손상시킬 수 있다.명명된 매개변수를 가능한 사용하지 않는 것이 좋고, public이나 protected 메서드라면

빌 와그너, ⌜More Effective C# 2판⌟, 김완섭 옮김, 한빛미디어, 2019 이 포스팅은 ⌜More Effective C# 2판⌟의 내용을 기반으로 작성되었습니다. 아이템 13: 타입의 가시성을 제한하라 모든 타입이 public일 필요는 없으며, 타입

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*추상 베이스 클래스와 인터페이스 두 가지 접근법은 각자의 역할이 명확하므로 반드시 구분해서 사용해야 한다.'is a'(~는 ~이다)를 의미클래스의 상속 계통에서 공통의 조상

빌 와그너, ⌜More Effective C# 2판⌟, 김완섭 옮김, 한빛미디어, 2019 이 포스팅은 ⌜More Effective C# 2판⌟의 내용을 기반으로 작성되었습니다. 아이템 15: 인터페이스 메서드와 가상 메서드 차이를 이해하라 인터페이스를 구현하는 것

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*.NET 이벤트 패턴은 관찰자 패턴(Observer patten)을 구현한 문법이벤트와 델리게이트를 같은 것이라고 착각하면 안된다.어떤 타입이 시스템의 변화에 대해서 다수의

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C읽기 전용 속성은 호출자가 수정하지 못할거라 생각되지만 항상 그런 것은 아니다.예시 참조 타입을 반환하는 멤버는 해당 객체의 핸들을 반환한다.내부 구조를 가리키는 핸들을 호출측에 넘기

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*.NET 클래스가 이벤트를 처리하기 위한 두 가지 방법을 제공함이벤트 핸들러를 작성하는 방식베이스 클래스에 있는 가상 함수를 오버라이딩 하는 방식이벤트 핸들러 작성상속 관계

빌 와그너, ⌜More Effective C# 2판⌟, 김완섭 옮김, 한빛미디어, 2019 이 포스팅은 ⌜More Effective C# 2판⌟의 내용을 기반으로 작성되었습니다. 아이템 19: 베이스 클래스에 정의된 메서드를 오버로드해서는 안 된다 개발자는 멤버의

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*이벤트는 상태를 수신하는 타입으로 부터 클래스를 완전히 분리시킨다.어떤 코드든 원하는 이벤트를 구독하여, 해당 이벤트가 발생했을 때 필요한 처리를 수행할 수 있다.하지만 이

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*C필드와 정의 방식으로 이벤트를 선언하면 내부적으로 add(), remove()와 같은 함수가 만들어지기 때문에 다른 클래스 가상 선언처럼 문제가 단순하지 않다.베이스 클래

빌 와그너, ⌜More Effective C# 2판⌟, 김완섭 옮김, 한빛미디어, 2019 이 포스팅은 ⌜More Effective C# 2판⌟의 내용을 기반으로 작성되었습니다. 아이템 22: 명확하고 간결하며 완결된 메서드 그룹을 생성하라 메서드를 많이 오버로드할

빌 와그너, ⌜More Effective C# 2판⌟, 김완섭 옮김, 한빛미디어, 2019 이 포스팅은 ⌜More Effective C# 2판⌟의 내용을 기반으로 작성되었습니다. 아이템 23: 생성자, 변경자, 이벤트 핸들러를 위해 partial 클래스와 메서드를 제

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*복제 지원 인터페이스메서드 : Clone()구현 예시IClonable은 구현한 타입이 상속 계통에 있다면, 파생 타입에도 영향을 끼친다.즉, IClonable을 지원하기로

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*매개 변수로 배열을 사용하면 예측하기 어려운 다양한 문제에 노출된다.컬렉션이나 가변 길이의 매개변수를 취하도록 메서드를 작성하는 것이 훨씬 낫다.매개변수로 배열을 사용했을때

빌 와그너, ⌜More Effective C# 2판⌟, 김완섭 옮김, 한빛미디어, 2019 이 포스팅은 ⌜More Effective C# 2판⌟의 내용을 기반으로 작성되었습니다. 아이템 26: 지역 함수를 사용해서 반복자와 비동기 메서드의 오류를 즉시 보고하라 고수

빌 와그너, ⌜More Effective C# 2판⌟, 김완섭 옮김, 한빛미디어, 2019 이 포스팅은 ⌜More Effective C# 2판⌟의 내용을 기반으로 작성되었습니다. 3장 - 태스크 기반 비동기 프로그래밍 TPL(Task Parallel Library

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*async void 메서드를 작성하면 이 메서드가 던지는 예외를 호출 측에서 잡지 못한다.보통 비동기 메서드는 예외를 던지면 태스크 객체가 오류가 된다.await 구문에서

비동기 메서드를 사용한다는 것은 작업이 오래걸릴 수 있으니 호출자는 그동안 다른 유용한 일을 하라는 의미동기 메서드를 사용한다는 것은 메서드가 반환되기만 하면 모든 사후 조건을 충족한다는 것을 의미이처럼 서로 다른 두 방식을 섞어 사용하면 좋지 않은 API가 만들어져

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*모든 비동기 작업이 서로 다른 스레드에서 수행되지는 않는다.비동기 작업이 새로운 스레드를 생성하지 않는 경우도 많다.파일 입출력은 비동기 이지만 스레드가 아닌 I/O 완료

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C태스크와 컨티뉴에이션에 대한 설명 출처 : https://learn.microsoft.com/en-us/dotnet/standard/parallel-programming/ch

태스크 기반 비동기 프로그래밍 모델은 진행을 취소하거나 보고하기 위한 표준 API를 제공한다.내부적으로 수행해야 하는 작업이 취소를 지원하지 않을 수 있으므로, 작업을 취소할 수 없는 비동기 태스크도 있다.취소할 수 없는 작업임에도 취소가 가능함을 뜻하는 오버로드 메서

이전에는 비동기 코드의 반환 타입으로 Task나 Task<T>를 사용했다.하지만 때에 따라 Task 타입 때문에 성능이 떨어지기도 한다.자주 호출되는 코드에서 사용하면, 비동기 메서드용으로 Task 인스턴스를 생성하고 사용하는 비용이 부담될 수 있다.C대신 asy

PLINQ 병렬 쿼리 예시코드AsParallel()은 IEnumerable()이 아닌 IParallelEnumerable()을 반환한다.하지만 IEnumerable과 거의 동일하기 때문에 단순히 대체하기만 하면 된다.병렬은 쿼리를 수행하기 위해 분할하여 수행하기 때문에

아이템 36 : 예외를 염두에 두고 병렬 알고리즘을 만들라 자식 스레드는 언제든 예외를 일으킬 수 있으며 개발자가 처리해야 한다. 예외는 스레드의 경계를 넘어 다른 스레드로 전달될 수 없다. 호출 스택이 계속 이어질 수 없다는 뜻이다. 병렬 작업은 Aggregat

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*어플리케이션 코드에서 직접 스레드를 만들기 보다, 스레드와 스레드 풀을 알아서 관리해주는 라이브러리를 사용하는 것이 좋다.이미 존재하는 스레드풀에서 사용 가능한 작업 스레드

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*QueueUserWorkerItem()을 사용할 때는 규칙을 준수해야 한다.규칙 준수를 위해 작업이 오히려 더 늘어날 수 있다.QueueUserWorkerItem()를 사용

빌 와그너, ⌜More Effective C# 2판⌟, 김완섭 옮김, 한빛미디어, 2019 이 포스팅은 ⌜More Effective C# 2판⌟의 내용을 기반으로 작성되었습니다. 아이템 39: XAML 환경에서 스레드 간 호출을 이해하라 윈도우 컨트롤은 COM(Co

빌 와그너, ⌜More Effective C# 2판⌟, 김완섭 옮김, 한빛미디어, 2019 이 포스팅은 ⌜More Effective C# 2판⌟의 내용을 기반으로 작성되었습니다. 아이템 40: 동기화에는 lock()을 최우선으로 사용하라 스레드들은 공유 데이터에 대

빌 와그너, ⌜More Effective C# 2판⌟, 김완섭 옮김, 한빛미디어, 2019 이 포스팅은 ⌜More Effective C# 2판⌟의 내용을 기반으로 작성되었습니다. 아이템 41 : 락은 가능한 한 좁은 범위에 적용하라 동시성 프로그램을 작성할 때 동기

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective C\*\*\*아이템 41에서 다뤘던 내용대로 private 데이터 멤버를 락으로 사용해 락의 보호를 받는 코드를 지역화 시켜 교착상태를 해결하였다.하지만 .NET Framework에서

빌 와그너, ⌜More Effective C# 2판⌟, 김완섭 옮김, 한빛미디어, 2019 이 포스팅은 ⌜More Effective C# 2판⌟의 내용을 기반으로 작성되었습니다. 5장 - 동적 프로그래밍 동적 타이핑은 개발 시간을 줄여주고 다른 시스템 간 상호운용성

빌 와그너, ⌜More Effective C# 2판⌟, 김완섭 옮김, 한빛미디어, 2019 이 포스팅은 ⌜More Effective C# 2판⌟의 내용을 기반으로 작성되었습니다. 아이템 44: 제네릭 타입 매개변수의 런타임 타입을 활용하려면 동적 타이핑을 사용하라

빌 와그너, ⌜More Effective C# 2판⌟, 김완섭 옮김, 한빛미디어, 2019 이 포스팅은 ⌜More Effective C# 2판⌟의 내용을 기반으로 작성되었습니다. 아이템 45: 데이터 주도 동적 타입에는 DynamicObject나 IDynamicMet

빌 와그너, ⌜More Effective C# 2판⌟, 김완섭 옮김, 한빛미디어, 2019 이 포스팅은 ⌜More Effective C# 2판⌟의 내용을 기반으로 작성되었습니다. 아이템 46: 표현식 API의 사용법을 익혀두라 C#에 LINQ와 동적 지원 기능이 추

빌 와그너, ⌜More Effective C이 포스팅은 ⌜More Effective Cdynamic 객체는 모든것을 동적으로 만들어 버린다.작업의 대상이 되는 매개변수 중 하나라도 dynamic이라면 그 결과도 dynamic이 된다.또한 메서드가 동적 객체를 반환하면