program tip

string.Format이 null 값을 처리하는 방법은 무엇입니까?

radiobox 2020. 12. 2. 08:17
반응형

string.Format이 null 값을 처리하는 방법은 무엇입니까?


아래 코드에서 두 string.Format호출이 동일한 방식으로 작동하지 않는 이유는 무엇입니까? 첫 번째에서는 예외가 발생하지 않지만 두 번째에서는 예외 ArgumentNullException가 발생합니다.

static void Main(string[] args)
{
    Exception e = null;
    string msgOne = string.Format("An exception occurred: {0}", e);
    string msgTwo = string.Format("Another exception occurred: {0}", null);
}

누군가가 둘의 차이점을 이해하도록 도와 주시겠습니까?


나는 여기에서 추측하고 있지만, 당신이 치는 오버로드 콜의 차이 인 것 같습니다. String.Format오버로드가 여러 개있는 경우 바로 그 정도입니다.

첫 번째 예에서는을 치는 것이 합리적 String.Format(string,object)입니다.

두 번째 예 에서는 문서에 따라 다음과 같은 경우를 발생 시킬 null가능성이 가장 높습니다 .String.Format(string,params object[])ArgumentNullException

format 또는 args가 null입니다.

.NET4를 실행중인 경우 명명 된 매개 변수를 사용해보십시오.

String.Format("Another exception occured: {0}", arg0: null);

params object[]과부하가 걸리는 이유는 무엇 입니까? 아마 때문에이 null객체가 아닌, 그리고 그 길을 params작동하면 통과 할 수 있다는 것입니다 중 하나를 호출에 새로운 개체로 각 값을 하거나 그것을 값의 배열을 전달합니다. 즉, 다음은 동일한 것입니다 .

String.Format("Hello, {0}! Today is {1}.", "World", "Sunny");
String.Format("Hello, {0}! Today is {1}.", new Object[]{ "World", "Sunny" })

그래서 그것은 당신의 진술 호출을 다음과 같은 라인을 따라 무언가로 번역하고 있습니다.

String format = "Another exception occured: {0}";
Object[] args = null;
String.Format(format, args); // throw new ArgumentNullException();

첫 번째 예에서를 치면 Format(String, Object)분해 될 때 다음과 같이 보입니다.

 public static string Format(string format, object arg0)
 {
    return Format(null, format, new object[] { arg0 });
 }

new object[]주변에 유의하십시오 .

두 번째는 분명히 Format(string, object[])사용에 타격을 입히고 있습니다. 적어도 동일한 테스트를 수행 할 때 호출되는 것입니다. 분해하면 다음과 같습니다.

 public static string Format(string format, params object[] args)
 {
     return Format(null, format, args);
 }

따라서 이들 모두는 실제로 Format(IFormatProvider, string, object[]). 좋습니다. 처음 몇 줄을 살펴 보겠습니다.

public static string Format(IFormatProvider provider, string format, params object[] args)
{
    if ((format == null) || (args == null))
    {
        throw new ArgumentNullException((format == null) ? "format" : "args");
    }
...
}

... 환영합니다, 바로 거기에 문제가 있습니다! 첫 번째 호출은 새 배열로 래핑하므로 null이 아닙니다. null을 명시 적으로 전달 Format()하는 것은 호출 하는 특정 인스턴스로 인해 그렇게하지 않습니다 .


첫 번째 호출은 Format (object)에 대한 호출로 해결되고 두 번째 호출은 Format (object [])에 대한 호출로 해결됩니다. Null 매개 변수는 이러한 다양한 오버로드에 의해 다르게 처리됩니다.

여기에서는 과부하 해결에 대해 설명 합니다 . 관련 부분은 Format에 대한 두 번째 호출의 경우 Format (params object []) 오버로드가 Format (object)보다 선호되는 Format (object [])로 확장된다는 것입니다. 리터럴 null은 object []와 개체 모두이지만 object []가 더 구체적이므로 선택됩니다.


보간 된 문자열 ($ "", 다른 형식 지정 방법)을 사용하는 경우 null은 무시되고 건너 뜁니다. 그래서

string nullString = null;
Console.WriteLine($"This is a '{nullString}' in a string");

"This is a ''in a string"이 생성됩니다. 물론 null의 경우 null 병합 연산자를 사용하여 필요한 출력을 생성 할 수 있습니다.

string nullString = null;
Console.WriteLine($"This is a '{nullString ?? "nothing"}' in a string");

다음과 같은 두 가지 차이점이 있습니다.

  1. 여기서는 Null 값이 할당됩니다.

    Exception e = null;
    string msgOne = string.Format("An exception occurred: {0}", e);
    
  2. 여기서 Null 값은 문자열 형식으로 읽을 수 없으므로 유형 캐스팅 오류를 의미합니다.

    string msgTwo = string.Format("Another exception occurred: {0}", null);
    

간단한 예를 들어 보겠습니다. 여기서는 NULL 값을 문자열 형식으로 읽을 수 없습니다.

string str = null.toString();

참고URL : https://stackoverflow.com/questions/13276418/how-string-format-handles-null-values

반응형