선택적 매개 변수의 기본값으로 String.Empty를 사용할 수 없습니다.
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;
}
...하지만 항상 적절한 것은 아닙니다.
In conclusion:
- I very much doubt that this will ever be part of C#
- For
string.Empty
it's pointless anyway - For other values which really don't always have the same value, it really can be a pain
I never use string.Empty, I can't see the point of it. Maybe it makes it easier for people that are really new to programming, but I doubt it's useful even for that.
I think the idea behind string.Empty is it enhances readability. It is not like newline where there is any difference between how it is represented on different platforms. It's ashame it can't be used in a default parameter. However, it will not cause any issues if you port between Windows and something like Mono on Linux.
As a FYI, it looks like the same constraint is imposed on values passed to attribute constructors - they must be constant. Since string.empty is defined as :
public static readonly string Empty
rather than an actual constant, it cannot be used.
I use string.Empty
purely for readability.
If someone else needs to read/change my code later they know that I meant to check for or set something to an empty string. Using just ""
can sometimes cause bugs and confusion because I may have just forgot to put the string that I wanted in there.
For example:
if(someString == string.Empty)
{
}
vs
if(someString == "")
{
}
The first if
statement just seems so much more deliberate and readable to me. Because this is just a preference though, I really do not see the train-smash in having to use ""
instead of string.Empty
.
Perhaps the best solution to this problem is an overload of this method, in this way:
public static void PrintString()
{
PrintString(string.Empty);
}
'developer tip' 카테고리의 다른 글
동적 다형성을 피하기위한 CRTP (0) | 2020.09.12 |
---|---|
Force-directed 레이아웃에 새 노드 추가 (0) | 2020.09.12 |
SQL Server에 열 추가 (0) | 2020.09.12 |
데이터 소스를 변경하지 않고 DataGridView 필터링 (0) | 2020.09.12 |
Node.js로 HTML 페이지를 구문 분석하는 방법 (0) | 2020.09.12 |