.NET은 널 문자열을 string.empty로 해결하는 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/1241112

  •  12-09-2019
  •  | 
  •  

문제

널 문자열을 string으로 해결하는 한 줄 메소드가 있습니다. Empty는 확장 방법으로 유용 할 수 있다고 생각하지만 유용한 방법을 찾을 수는 없습니다.

내가 유용한 것을 볼 수있는 유일한 방법은 인스턴스가 null이므로 인스턴스에 기인 할 수없고 컴파일러 오류가 발생하기 때문에 문자열 클래스에서 정적 메소드입니다. [편집 : 컴파일러 오류는 초기화되지 않은 변수로 인한 것입니다.

나는 그것을 헬퍼 클래스에 추가하는 것에 대해 생각했지만 발견 가능성 관점에서 불필요한 복잡성을 더합니다.

이 질문은 내가 생각하는 두 부분에 있습니다.

  1. .NET 프레임 워크는 널 문자열을 string으로 해결하는 방식으로 내장되어 있습니까?
  2. 그렇지 않은 경우 -이 메소드를 문자열 클래스의 정적 확장으로 추가하는 방법을 알고 있습니까?

미리 건배

편집하다:

좋아, 나는 조금 더 분명했을 것 같아요 - 나는 이미 널 거절을 잘 알고 있고 해시 코드 계산을 위해 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을 다룰 준비를해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top