개발/C#

[Effective C#] string.Format()을 보간 문자열로 대체하라

huiyu 2021. 1. 17. 06:00

String.Format 메서드 (링크)

String s = String.Format("The current price is {0} per ounce.",
                         pricePerOunce);
Console.WriteLine(s);

생성된 문자열을 직접 출력해보고 올바른 형태인지 직접 확인하기 전까지 코드를 제대로 작성했는지 확인이 어려움
- 포맷 문자열과 인자리스트를 분리하여 전달
- 포맷 문자열에 나타낸 인자의 개수와 실제 전달되는 인자의 개수가 일치하는지 확인하지 않음.
- 개발자의 실수로 누락하여 런타임 에러가 발생할 수 있음

 

$ 문자열 보간 (링크)

string name = "Mark";
var date = DateTime.Now;

// Composite formatting:
Console.WriteLine("Hello, {0}! Today is {1}, it's {2:HH:mm} now.", name, date.DayOfWeek, date);
// String interpolation:
Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.");
// Both calls produce the same output that is similar to:
// Hello, Mark! Today is Wednesday, it's 19:40 now.

사용규칙

 - $를 문자열 앞에 붙여서 사용.
 - 문자열로 변경할 표현식은 {} 중괄호안에 둔다.

문자열 보간($)의 장점

1) 코드 가독성 향상
2) 컴파일러 입장에서 정적타입 검사 수행하여, 개발자 실수 미리 확인
3) 문자열을 생성하기 위한 표현식 더 풍성하게 사용
4) 인자 전달에 오류가 없다.

박싱과 언박싱

Console.WriteLine($"The value of pi is {Math.PI}");

 사용자가 문자열 보간을 사용하더라도 실제 C# 컴파일러는 param을 이용하여 object 배열을 전달하는 기존 포매팅 함수를 호출하도록 코드를 생성한다. 위 예제는 Math.PI는 double형이므로 이를 object타입으로 변경하는 박싱을 수행한다. 이러한 박싱은 너무 자주 사용하거나 루프 내에서 사용하게 되면 성능에 좋지 않을 수 있다. 이러한 경우 미리 전달할 인자를 문자열로 변경하면 값 타입이 박싱되는 것을 피할 수 있다.

Console.WriteLine($"The value of pi is {Math.PI.ToString()}");

 

':' 조건 연산자 사용 

Console.WriteLine($"The value of pi is {round ? Math.PI.ToString() : Math.PI.ToString("F2")}");

 

'?', '??' 연산자 사용

Console.WriteLine($"The customer's name is {c?.Name ?? "Name is missing"}");

 

728x90
반응형