.NET은 널 문자열을 string.empty로 해결하는 방법이 있습니까?
문제
널 문자열을 string으로 해결하는 한 줄 메소드가 있습니다. Empty는 확장 방법으로 유용 할 수 있다고 생각하지만 유용한 방법을 찾을 수는 없습니다.
내가 유용한 것을 볼 수있는 유일한 방법은 인스턴스가 null이므로 인스턴스에 기인 할 수없고 컴파일러 오류가 발생하기 때문에 문자열 클래스에서 정적 메소드입니다. [편집 : 컴파일러 오류는 초기화되지 않은 변수로 인한 것입니다.
나는 그것을 헬퍼 클래스에 추가하는 것에 대해 생각했지만 발견 가능성 관점에서 불필요한 복잡성을 더합니다.
이 질문은 내가 생각하는 두 부분에 있습니다.
- .NET 프레임 워크는 널 문자열을 string으로 해결하는 방식으로 내장되어 있습니까?
- 그렇지 않은 경우 -이 메소드를 문자열 클래스의 정적 확장으로 추가하는 방법을 알고 있습니까?
미리 건배
편집하다:
좋아, 나는 조금 더 분명했을 것 같아요 - 나는 이미 널 거절을 잘 알고 있고 해시 코드 계산을 위해 12 개 정도의 문자열이 검사되는 곳에서 이것을 사용하고있었습니다.
당신이 상상할 수 있듯이, Null Cooallescing Syntax를 포함하는 12 줄의 코드는 서로 밀접하게 따라 가면 눈이 더 쉬워 지도록 Null Cooallescing 조작을 방법으로 옮겼습니다. 그러나 완벽한 것은 문자열 객체에 대한 완벽한 확장입니다.
int hashcode =
FirstValue.ResolveNull().GetHashCode() ^
SecondValue.ResolveNull().GetHashCode() ^
...
12 개 이상의 줄은 다음과 같이 읽기가 훨씬 쉽습니다.
int hashcode =
(FirstValue ?? String.Empty).GetHashCode() ^
(SecondValue ?? String.Empty).GetHashCode() ^
...
문자열 값을 null로 명시 적으로 선언하지 않았지만 암시 적에 의존 할 때 컴파일러 문제가 발생했습니다.
string s;
그러나 만약 당신은 명시 적으로 정의합니다.
string s = null;
쉽게 전화 할 수 있습니다.
s.ResolveNull();
귀하의 의견에 감사드립니다.
해결책
내가 유용한 것을 볼 수있는 유일한 방법은 인스턴스가 null이므로 인스턴스에 기인 할 수 없기 때문에 런타임 오류가 발생하기 때문에 문자열 클래스에서 정적 메소드로서 정적 메소드입니다.
C# 3.0 확장 메소드는 NULL 수신기에서 호출 할 수 있지만 (실제로 정적이므로) 인스턴스 방법으로 작동합니다. 따라서 확장 방법으로 만드십시오.
다른 팁
나는 이것을 위해 내장 된 것이 있다고 생각하지 않습니다. 나의 첫 번째 생각과 내가 자주하는 일은 Coalesce Operator를 사용하는 것입니다.
string s = null;
string x = s ?? string.Empty;
일부 발현 - 볼링 (s ?? "");
흥분하는 점이 없습니다 string.Empty
vs ""
- 무시할만한 차이가 있습니다.
Console.WriteLine(ReferenceEquals(string.Empty, "")); // true
확장 방법 :
public static class StringExtensions
{
public static String EmptyIfNull(this String instance)
{
return instance ?? String.Empty;
}
}
물론, 당신은 쉽게 쓸 수 있습니다 instance ?? String.Empty
null 대신 string.empty를 사용해야하는 장소에서.
string test = CouldReturnNull() ?? string.Empty;
당신은 사용할 수 있습니다 ?? 연산자 (Null-Coalescing 연산자) C#에서 - 그게 무슨 뜻입니까? 아니면 오해 했습니까?
예를 들어.
string n = null;
string y = n ?? String.Empty;
y는 = string.empty;
string abc = s ?? string.Empty;
나는 이것을 확장 방법으로 구현하는 것이 스웨덴에서 우리가 전화하는 것과 비슷하다고 느낄 것이라고 말할 것입니다. "물을 가져 오기 위해 개울 반대편으로 여행하기". null 대신에 빈 줄을 얻도록해야 할 때 나는 종종 그냥 연결합니다. string.Empty
:
public void SomeMethod(string param)
{
string notNull = param + string.Empty;
}
물론, 이것은 여분의 문자열 인스턴스가 생성 될 수 있지만, 대부분의 실제 상황에서는 문제가되지 않았습니다.
이를위한 빌드 기능이 없습니다. 그러나 문자열 유형에 대한 작은 확장 방법 (또는 정적 멘트)을 다음과 같은 문자로 작성할 수 있습니다.
반환 s ?? string.emtpy;
string.empty를 추가하십시오 모든 문자열 변수에 대해서는 NULL을 얻지 못할 것입니다.
string a = null;
string b = null + string.Empty;
string c = "a" + string.Empty;
(a == string.Empty).Dump(); // False
(b == string.Empty).Dump(); // True
(c == "a").Dump(); // True
나는 이것을 linqpad로 던 졌기 때문에 .dump ()의
옵션을보고 ...
이 기술
string b = null + string.Empty;
생성합니다
IL_0001: ldsfld System.String.Empty
IL_0006: dup
IL_0007: brtrue.s IL_000F
IL_0009: pop
IL_000A: ldstr ""
IL_000F: stloc.0
다른 인기있는 옵션 :
string b = null ?? string.empty
생성합니다
IL_0001: ldsfld System.String.Empty
IL_0006: stloc.0
이
string b = null + "";
이것을 생성합니다
IL_0001: ldstr ""
IL_0006: stloc.0
나는 여전히 선호합니다
string b = null + "";
그러나 실제로, IMO, 당신은 줄을 소화 할 때 null을 다룰 준비를해야합니다.