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");
다음과 같은 두 가지 차이점이 있습니다.
여기서는 Null 값이 할당됩니다.
Exception e = null; string msgOne = string.Format("An exception occurred: {0}", e);
여기서 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
'program tip' 카테고리의 다른 글
Django의 다중 테넌트 애플리케이션을위한 최적의 아키텍처 (0) | 2020.12.02 |
---|---|
HTTP_CLIENT_IP와 HTTP_X_FORWARDED_FOR의 차이점은 무엇입니까? (0) | 2020.12.02 |
CSS를 사용하여 고정 헤더로 스크롤 가능한 테이블을 만드는 방법 (0) | 2020.12.02 |
순간 현재 날짜 가져 오기 (0) | 2020.12.01 |
중첩 된 종속성을`yarn`으로 재정의하려면 어떻게해야합니까? (0) | 2020.12.01 |