다음을 수행하는 간단한 방법이 있습니까?
String s = myObj == null ? "" : myObj.ToString();
다음을 수행 할 수 있다는 것을 알고 있지만 실제로는 해킹으로 간주합니다.
String s = "" + myObj;
Convert.ToString ()에 적절한 오버로드가 있으면 좋을 것입니다.
다음을 수행하는 간단한 방법이 있습니까?
String s = myObj == null ? "" : myObj.ToString();
다음을 수행 할 수 있다는 것을 알고 있지만 실제로는 해킹으로 간주합니다.
String s = "" + myObj;
Convert.ToString ()에 적절한 오버로드가 있으면 좋을 것입니다.
답변:
C # 6.0 편집 :
C # 6.0에서는 이제 간결하고 캐스트없는 버전의 orignal 메서드를 사용할 수 있습니다.
string s = myObj?.ToString() ?? "";
또는 보간을 사용하여 :
string s = $"{myObj}";
원래 답변 :
string s = (myObj ?? String.Empty).ToString();
또는
string s = (myObjc ?? "").ToString()
더 간결하게합니다.
불행히도 지적했듯이 비 String 또는 Object 유형에서이 작업을 수행하려면 양쪽에 캐스트가 필요한 경우가 많습니다.
string s = (myObjc ?? (Object)"").ToString()
string s = ((Object)myObjc ?? "").ToString()
따라서 우아하게 보일 수 있지만 캐스트는 거의 항상 필요하며 실제로는 그렇게 간결하지 않습니다.
다른 곳에서 제안했듯이 확장 방법을 사용하여 더 깔끔하게 만드는 것이 좋습니다.
public static string ToStringNullSafe(this object value)
{
return (value ?? string.Empty).ToString();
}
string.Format("{0}", myObj);
string.Format은 null을 빈 문자열로 형식화하고 null이 아닌 객체에서 ToString ()을 호출합니다. 내가 이해했듯이 이것은 당신이 찾고 있던 것입니다.
"" + myObj
. 그러나 나는 여분의 문자열을 만드는 것을 읽었습니다. str.Concat(myObj)
잘 작동하는 것 같고 "더 빠릅니다".
Convert.ToString ()에 적절한 오버로드가 있으면 좋을 것입니다.
가있었습니다 Convert.ToString(Object value)
닷넷 2.0 이후 (약 오년 전에 질문을 받았다이 Q.) 당신이 원하는 것을 정확히 할 나타납니다 :
http://msdn.microsoft.com/en-us/library/astxcyeh(v=vs.80).aspx
내가 여기서 정말 명백한 것을 놓치고 있거나 잘못 해석하고 있습니까?
확장 메서드를 사용하면 다음을 수행 할 수 있습니다.
public static class Extension
{
public static string ToStringOrEmpty(this Object value)
{
return value == null ? "" : value.ToString();
}
}
다음은 화면에 아무것도 쓰지 않고 예외를 throw하지 않습니다.
string value = null;
Console.WriteLine(value.ToStringOrEmpty());
string s = "" + myObj;
hackish 라고 생각 하면 null 객체에 대한 함수를 호출하는 것은 동일한 보트에 속해야합니다. 나는 이것을 반대표를 던지지 만 그것은 당면한 문제를 해결합니다. 나는 단지 사용법에 동의하지 않습니다. NullReferenceException
확장 메서드에서도 Null 개체는을 throw해야 합니다.
ToStringOrEmptyWhenNull
.
this
매개 변수)가 구문 적 설탕 일 뿐이므로 발생하지 않습니다 . 즉이 x.SomeExtensionMethod()
에 대한 문법 설탕입니다 SomeStaticClass.SomeExtensionMethod(x);
따라서, 때 x
입니다 null
우리는의 메소드 호출을 시도하지 않는 null
개체를 오히려 통과 null
정적 방법으로 개체를. 해당 메소드가 null
매개 변수를 확인 하고이를 만났을 때 발생 하는 경우에만 확장 메소드가 null
객체 에서 "호출"됩니다 .
나는 이것에 동의하지 않는다 :
String s = myObj == null ? "" : myObj.ToString();
어떤 식 으로든 해킹입니다. 명확한 코드의 좋은 예라고 생각합니다. 달성하려는 것이 무엇인지 그리고 null을 기대하고 있다는 것은 절대적으로 분명합니다.
최신 정보:
나는 당신이 이것이 해킹이라고 말하지 않았 음을 알았습니다. 그러나 당신이이 방법이 갈 길이 아니라고 생각한다는 것은 질문에 내포되어 있습니다. 제 생각에는 확실히 가장 명확한 해결책입니다.
string s = String.Concat(myObj);
내가 추측하는 가장 짧은 방법이며 성능 오버 헤드도 무시할 수 있습니다. 의도가 무엇인지 코드 독자에게 명확하지 않을 수 있지만 명심하십시오.
Concat
실제로 아래에 null 검사를 수행하고 string.Empty
또는 arg0.ToString()
약간 더 성능이 좋은 것 같습니다 (여기서는 ms를 이야기하고 있습니다).
사실 나는 당신이 무엇을하고 싶은지 이해하지 못했습니다. 내가 이해했듯이이 코드를 이와 같은 다른 방식으로 작성할 수 있습니다. 이건 물어 보는 건가요? 더 설명해 주시겠습니까?
string s = string.Empty;
if(!string.IsNullOrEmpty(myObj))
{
s = myObj.ToString();
}
string s = string.IsNullOrEmpty(myObj) ? string.Empty : myObj.ToString();
나는 내 대답에 맞을 수도 있지만 어쨌든 여기에 간다.
나는 단순히 쓸 것이다
string s = ""if (myObj! = null) {x = myObj.toString (); }
삼항 연산자를 사용하여 성능 측면에서 보답이 있습니까? 나는 내 머리 꼭대기에서 모른다.
그리고 분명히 위에서 언급했듯이 재사용을 허용하는 safeString (myObj)와 같은 메소드에이 동작을 넣을 수 있습니다.
다양한 옵션을 요약 한 일부 (속도) 성능 테스트, 정말 중요하지는 않습니다. #microoptimization ( linqpad 확장 사용 )
void Main()
{
object objValue = null;
test(objValue);
string strValue = null;
test(strValue);
}
// Define other methods and classes here
void test(string value) {
new Perf<string> {
{ "coallesce", n => (value ?? string.Empty).ToString() },
{ "nullcheck", n => value == null ? string.Empty : value.ToString() },
{ "str.Format", n => string.Format("{0}", value) },
{ "str.Concat", n => string.Concat(value) },
{ "string +", n => "" + value },
{ "Convert", n => Convert.ToString(value) },
}.Vs();
}
void test(object value) {
new Perf<string> {
{ "coallesce", n => (value ?? string.Empty).ToString() },
{ "nullcheck", n => value == null ? string.Empty : value.ToString() },
{ "str.Format", n => string.Format("{0}", value) },
{ "str.Concat", n => string.Concat(value) },
{ "string +", n => "" + value },
{ "Convert", n => Convert.ToString(value) },
}.Vs();
}
아마도 Convert.ToString(...)
널 문자열을 유지할 것이라는 점을 지적하는 것이 중요 할 것입니다 .
Holstebroe의 의견이 가장 좋은 답변이 될 것입니다.
string s = string.Format("{0}", myObj);
경우 myObj
널 (null)이며, 형식이 빈 문자열 값을 배치합니다.
또한 한 줄 요구 사항을 충족하며 읽기 쉽습니다.
이것은 오래된 질문이고 OP가 C #을 요청했지만 C #이 아닌 VB.Net을 사용하는 사람들을 위해 VB.Net 솔루션을 공유하고 싶습니다.
Dim myObj As Object = Nothing
Dim s As String = If(myObj, "").ToString()
myObj = 42
s = If(myObj, "").ToString()
불행히도 VB.Net은 변수 뒤에?-연산자를 허용하지 않으므로 myObj? .ToString이 유효하지 않습니다 (적어도 솔루션을 테스트하는 데 사용한 .Net 4.5에서는 아님). 대신 myObj가 Nothing 인 경우 빈 문자열을 반환하기 위해 If를 사용합니다. 따라서 첫 번째 Tostring-Call은 빈 문자열을 반환하고 두 번째 (myObj가 Nothing이 아닌 경우)은 "42"를 반환합니다.