본문 바로가기

Programming/C#, WPF

끄적끄적

Effective C#

 

1. 지역 변수를 사용할 때는 var를 사용하는 것이 낫다.

 

타입을 명확하게 나타내야 하는 경우가 아니라면 var를 사용하는 것이 좋다.

다만 숫자 타입(int, float, double)등을 선언할 때는 정밀도 때문에 명시적 선언이 좋다.

명확하게 타입을 선언하더라고 가독성이나 안정성이 향상되는 것은 아니다.

올바르게 타입을 명시하지 않은 경우에 var로 선언했을 때 컴파일러의 도움으로 피해갈 수 있는 문제를

강제로 발생시키는 꼴이 될 수도 있다.

 

 

 

2. const보다는 readonly가 좋다.

 

const는 컴파일 상수, readonly는 런타임 상수이다.

(컴파일 상수: 컴파일 타임에 값이 설정된다.

                  숫자형, enum, 문자형, null에 대해서만 사용 가능

                  중간에 값 변경 시 재컴파일하지 않으면 변경되지 않음)

(런타임 상수: 실행 시에 값이 설정된다.

                  모든 타입에 사용 가능)

 

컴파일 상수가 약간 더 빠르지만 유연성이 떨어진다. 그래서 컴파일 상수는 성능이 매우 중요하고

상수의 값이 절대로 바뀌지 않는 경우에만 사용하는 것이 좋다.

 

특성의 매개변수, switch/case문의 레이블, enum 정의 시 사용되는 상수등은 컴파일 시에 사용되야 함으로

const를 통해 초기화해야 한다. 

이러한 몇 가지 예외사항을 제외하고는 readonly를 사용하는 것이 좋다.

 

 

 

3. 캐스트 보다는 is, as가 좋다.

 

형변환을 수행해야 하는 경우 캐스팅보단 as 연산자를 사용하는 것이 좋다.

명시적 형변환 실패 시 에러가 발생하지만 as 연산자를 사용했을 때 실패 시 값이 null이 된다. 

is 연산자는 단순히 해상 형으로 변환가능한지 여부를 나타낸다 (true, false)

as 연산자는 참조 형식에만 사용가능하다. (int, float 같은 값 형식에는 사용 불가)

 

 

 

4. string.Format()을 보간 문자열로 대체하라

 

보간 문자열을 사용하려면 문자열 앞에 '$'을 붙인다.

문자열로 변경할 표현식은 { } 안에 넣는다.

 

ex:

Console.WriteLine($"PI = {Math.PI:F2});

Console.WriteLine($"My name is {c?.Name ?? "Name is missing"}");

 

 

 

5. 문화권별로 다른 문자열을 생성하려면 FormattableString을 사용하라.

    

 

 

6. nameof() 연산자를 적극 활용하라

 

 

심볼 그 자체를 문자열로 대체.

변수의 유효성을 검사, PropertyChanged 이벤트를 처리, 인터페이스, 네임스페이스에 대하여 사용가능.

심볼의 이름을 바꾸거나 수정할 경우에 쉽게 변경사항 반영 가능.