본문 바로가기

C#/기본적인 팁

기본적인 관용구

1.

변수 선언과 초기화는 동시에 이뤄져야 하는 것이 원칙이다.

 

 

2.

return 문을 통해 '체로 걸러 남는 것만 처리하는' 코드는 조건에 대해 잊어버리면서 코드를 읽어나갈 수 있으므로 편리하다.

 

 

3.

루프 도중에 처리를 중단하고 싶다면 break 문을 이용한다.

불필요한 임시변수를 도입하거나 인덱스를 제어하거나 return으로 처리를 중단하기보다 break문으로 루프를 빠져나가서 호출한 메서드로 돌아가는 것이 가장 좋다.

 

 

4.

null 합체 연산자를 이용하면 편리하다.

null 조건일 경우 기본값을 사용해야할 경우가 많이 있다.

null 합체 연산자(??)를 사용하면 다음과 같이 간결하게 작성할 수 있다.

var message = GetMessage(code) ?? DefaultMessage();

 

 

5.

null인지 아닌지를 판단해야할 때 null 조건 연산자를 이용하면 편리하다.

null인지 아닌지를 판단하는 코드를 null 조건 연산자(?.)를 사용해서 작성한 것은 다음과 같다.

return sale?.Product;

sale 변수가 null이 아닐 때는 Product 속성값을 변환하고 null일 때는 Product 속성에 접근하지 않고 null을 반환합니다.

 

 

6.

5. 와 6. 에서 언급한 null 조건 연산자와 null 합체 연산자를 같이 쓴 문장은 다음과 같다.

var product = GetProduct(id);
//product가 null일 때는 DefaultName이 name에 대입된다.
var name = product?.Name ?? DefaultName;

 

 

7.

속성 초기화에 관련된 관용구

public int MinimumValue { get; set; } = 6;
public string DefaultUri { get; set; } = GetDefaultUri();

 

 

8.

참조형인 읽기 전용 속성을 사용해야할 때

--> 컬렉션 자체를 수정할 수 없게 하려면 공개할 형을 IReadOnlyList<int>나 IEnumerable<int>로 지정해야 한다.

 

 

9.

여러 개의 인수를 받아들이지만 인수의 개수를 한정하고 싶지 않을 경우

즉 가변 인수를 받아들이는 메서드를 정의하는 경우 params 키워드를 사용한다.

주의!> 메서드 인자에서 params 키워드는 가장 마지막에 위치해야한다.

private void WriteLog(string format, params object[] args)

 

 

10.

파일 경로를 지정하려면 앞에 @을 붙인 축자 문자열 리터럴을 이용한다.

축자 문자열 리터럴을 사용하면 \ 기호가 이스케이프 시퀀스로 인식되지 않으므로 파일 경로를 그대로 기술할 수 있다.

 

 

11.

문자열을 숫자값으로 변환할 때

//변환 성공과 실패 각각의 경우를 처리해야할 때
//str은 문자열 변수, height는 변환된 결과가 대입될 int값
if(int.TryParse(str, out height)
{
    //변환에 성공했을 때 수행할 처리
}
else
{
    //변환에 실패했을 때 수행할 처리
}

//성공 실패 여부 신경 안쓰고 간단하게 대입
int height = int.Parse(str);

 

 

12.

참조형 객체를 다른 형으로 형변환하려면 as 연산자를 사용한다.

참고로 as 연산자는 참조형에만 사용할 수 있다.

as 연산자는 값형에는 사용하지 않는다.

 

 

13.

using을 사용해 리소스를 정리한다.

.Net 프레임워크 클래스 중에는 사용이 끝난 리소스를 정의하기 위해 Dispose 메서드를 호출해야하는 클래스가 존재한다.

IDisposable 인터페이스를 구현할 클래스가 여기에 해당한다.

 

파일, 데이터베이스, 네트워크처럼 외부의 자원에 접근하는 클래스가 대표적인 예이다.

 

실수로 Dispose 메서드를 호출하는 것을 잊으면 파일이 열린 상태로 있어 다른 사용자가 이용할 수 없게 되거나 메모리 누수가 발생하는 여러 가지 문제가 발생할 위험이 있다.

 

using 문을 사용해 Dispose 메서드를 확실히 호출하는 방법이 관용적으로 좋은 코드이다.

//StreamReader는 IDisposable 인터페이스를 구현한다.
//using을 사용해 리소스를 삭제하는 방법
using(var stream = new StreamReader(filePath))
{
    var texts = stream.ReadToEnd();
    ...//읽은 데이터 여기에서 처리
}

using을 빠져나갈 때 자동으로 Dispose 메서드가 호출된다.

 

IDisposable 인터페이스를 구현하는 클래스를 사용할 때는 using문을 사용해 리소스를 확실히 정리해야 한다.

IDisposable 인터페이스를 구현하지 않는 클래스는 using문을 사용할 수 없으므로 주의해야 한다.