Bill Wagner의 Effective C # 을 읽고 있습니다. 에서 항목 14 – 중복 초기화 로직을 최소화 , 그는 새로운 선택적 매개 변수는 생성자에서 기능을 사용하여 다음과 같은 예를 보여줍니다
public MyClass(int initialCount = 0, string name = "")
그가 사용하는 것을 알 수 ""
대신 string.Empty
.
그는 다음과 같이 말합니다.
[위의 예에서] 두 번째 생성자가 name 매개 변수 의 기본값으로 더 관례적인
string.Empty
. 이는string.Empty
컴파일 시간 상수가 아니기 때문 입니다. 문자열 클래스에 정의 된 정적 속성입니다. 컴파일 상수가 아니기 때문에 매개 변수의 기본값으로 사용할 수 없습니다.
string.Empty
모든 상황 에서 정적을 사용할 수 없다면 , 그것이 그 목적을 무너 뜨리지 않습니까? 나는 우리가 빈 문자열을 참조하는 시스템 독립적 인 수단을 가지고 있는지 확인하기 위해 그것을 사용할 것이라고 생각했습니다. 내 이해가 잘못 되었습니까? 감사.
업데이트
후속 댓글입니다. MSDN에 따르면 :
각 선택적 매개 변수에는 정의의 일부로 기본값이 있습니다. 해당 매개 변수에 대해 인수가 전송되지 않으면 기본값이 사용됩니다. 기본값은 상수 여야합니다.
그러면 우리는 System.Environment.NewLine
둘 중 하나 를 사용할 수 없거나 새로 인스턴스화 된 객체를 기본값으로 사용할 수 없습니다 . 아직 VS2010을 사용하지 않았는데 이것은 실망 스럽습니다!
답변
C # 2.0 컴파일러에서는 String.Empty
어쨌든 요점이 거의 없으며 실제로 컴파일러가 일부 참조를 인라인 ""
할 수 있지만 .NET 과 동일한 작업을 수행 할 수 없기 때문에 실제로는 비관적 입니다 String.Empty
.
C # 1.1에서는 빈 문자열을 모두 포함하는 많은 독립 개체를 만드는 것을 피하는 것이 유용했지만 그 시절은 사라졌습니다. ""
잘 작동합니다.
답변
선택적 매개 변수 값으로 실제로 사용하려는 경우 빈 문자열에 대한 자체 상수를 정의하는 것을 막을 수는 없습니다.
const string String_Empty = "";
public static void PrintString(string s = String_Empty)
{
Console.WriteLine(s);
}
[선호하도록 여담 이유로서 String.Empty
위에 ""
다른 답변에서 언급되지 않은, 일반적으로, 육안으로 보이지 않는 다양한 효과적으로 유니 코드 문자 (제로 참가자 폭 등)이 있다는 것이다. 따라서 보이는 ""
것이 반드시 빈 문자열은 아니지만 String.Empty
사용중인 것을 정확히 알고 있습니다. 이것이 버그의 일반적인 원인이 아니라는 것을 알고 있지만 가능합니다.]
답변
원래 질문에서 :
나는 우리가 빈 문자열을 참조하는 시스템 독립적 인 수단을 가지고 있는지 확인하기 위해 그것을 사용할 것이라고 생각했습니다.
어떤 방식으로 빈 문자열이 시스템마다 다를 수 있습니까? 항상 문자가없는 문자열입니다! false를 반환 하는 구현을 발견하면 정말 두려울 것입니다. string.Empty == ""
🙂 이것은 같은 것과 같지 않습니다Environment.NewLine
.
Counter Terrorist의 현상금 게시물에서 :
다음 C # 릴리스에서 String.Empty를 기본 매개 변수로 사용할 수 있기를 바랍니다. :디
글쎄 그것은 확실히 일어나지 않을 것입니다.
개인적으로 매우 다른 기본값 설정 메커니즘을 좋아했지만, 선택적 매개 변수가 작동하는 방식은 시작부터 .NET에있었습니다. 항상 메타 데이터에 상수를 포함하여 호출 코드가 해당 상수를 호출에 복사 할 수 있도록합니다. 해당 인수가 제공되지 않은 경우 사이트.
함께 string.Empty
그건 정말 무의미 – 사용하여 ""
당신이 원하는 것을 할 것입니다; 문자열 리터럴을 사용하는 것이 그렇게 고통 스럽습니까? (나는 모든 곳에서 리터럴을 사용합니다. 절대 사용하지 않습니다. string.Empty
하지만 그것은 다른 주장입니다.)
그것이이 질문에 대해 저를 놀라게하는 것입니다. 불만은 실제로 실제 문제를 일으키지 않는 무언가를 중심으로 이루어집니다 . 실제로 다를 수 있기 때문에 실행 시간에 기본값을 계산하려는 경우 더 중요합니다. 예를 들어, DateTime
매개 변수가 있는 메소드를 호출하고 기본값을 “현재 시간”으로 설정 하려는 경우를 상상할 수 있습니다 . 현재 내가 아는 모호하고 우아한 해결 방법은 다음과 같습니다.
public void RecordTime(string message, DateTime? dateTime = null)
{
var realDateTime = dateTime ?? DateTime.UtcNow;
}
…하지만 항상 적절한 것은 아닙니다.
결론적으로:
- 나는 이것이 C #의 일부가 될 것이라고 매우 의심합니다.
- 대한
string.Empty
그것의 무의미 어쨌든 - 항상 같은 값을 가지지 않는 다른 값의 경우 정말 고통 스러울 수 있습니다.
답변
나는 문자열을 사용하지 않습니다. 빈, 나는 그것의 요점을 볼 수 없습니다. 프로그래밍을 처음 접하는 사람들이 더 쉽게 사용할 수 있을지 모르지만, 그것조차도 유용 할 것 같지 않습니다.
답변
나는 string.Empty의 아이디어는 가독성을 향상시키는 것입니다. 다른 플랫폼에서 표현되는 방식에 차이가있는 개행 문자와는 다릅니다. 기본 매개 변수에서는 사용할 수 없습니다. 그러나 Windows와 Linux의 Mono와 같은 것 사이에 이식하면 문제가 발생하지 않습니다.
답변
참고로 속성 생성자에 전달 된 값에 동일한 제약 조건이 적용되는 것처럼 보입니다.이 값은 상수 여야합니다. string.empty는 다음과 같이 정의됩니다.
public static readonly string Empty
실제 상수가 아니라 사용할 수 없습니다.
답변
나는 string.Empty
순전히 가독성을 위해 사용 합니다.
다른 사람이 나중에 내 코드를 읽고 변경해야하는 경우에는 내가 무언가를 확인하거나 빈 문자열로 설정해야한다는 것을 알고 있습니다. just ""
을 사용하면 내가 원하는 문자열을 넣는 것을 잊었을 수 있기 때문에 때때로 버그와 혼란을 일으킬 수 있습니다.
예를 들면 :
if(someString == string.Empty)
{
}
vs
if(someString == "")
{
}
첫 번째 if
진술은 나에게 훨씬 더 신중하고 읽기 쉬운 것처럼 보입니다. 그러나 이것은 단지 선호 사항이기 때문에 . ""
대신 을 사용해야 한다는 기차 스매시가 실제로 보이지 않습니다 string.Empty
.