2016-06-14 2 views
-1

각기 다른 매개 변수 유형으로 구성된 응용 프로그램이 있습니다. 각 응용 프로그램은 매개 변수 개체와 선택적으로 연결할 수 있습니다.System.NullReferenceException 대신 빈 문자열을 반환합니다. 오류

다음은 나중에 다시로드하기 위해 XML 파일에 저장됩니다. 컨트롤을 매개 변수에 연결하려면 지정된 위치에 컨트롤이 매개 변수 ID를 저장합니다. 이것은로드하는 동안 검색되고 다시 링크됩니다.

그러나 선택 사항이므로 매개 변수를 지정하지 않으면 이해할 수있는 ID에 액세스 할 때 NullReferenceException이 발생합니다. 내가 문제의 라인 주위에 수표를 넣어 이것을 해결할 수 있습니다. 그러나 나는이 기본적인 예제에서 보여준 많은 다른 컨트롤 타입과 하나 이상의 참조를 위해 이것을해야 할 것이다.

내 질문은 우아한 방법으로이 호출이이 예외 대신 빈 문자열을 반환하도록 허용하는 것입니까? (6 C 번호에서 사용 가능)

public class Parameter 
{ 
    public string ID; 
} 

public class LabelCtrl 
{ 
    public string Name; 
    public Parameter LinkedParameter; 
} 

public class XMLManager 
{ 
    public void SaveControl(ControlInstance_LabelCtrl ci) 
    { 
    xmlWriter.WriteStartElement("ControlInstance_LabelCtrl"); 
    { 
     xmlWriter.WriteElementString("Name", ci.Name); 
     // Elegant way to insert empty string instead of causing NullReferenceException error 
     xmlWriter.WriteElementString("LinkedParameter", ci.LinkedParameter.ID); 
    } 
    xmlWriter.WriteEndElement(); 
    } 
} 
+0

Try/Catch를 사용하지 않는 이유는 무엇입니까? 또는 나는 무엇인가 놓치고 있냐? – uTeisT

+0

예외를 막을 수있는 이유는 무엇입니까? @uteist –

+0

내 말은, 그냥 try/catch에 넣고 catch 한 경우 String.Empty를 반환합니다. 또는 x가 null 인 경우 블록을 수행합니다. 뭔가 빠졌는지 아직도 궁금해. @PatrickHofman – uTeisT

답변

2

사용 널 전파 운영자 :

xmlWriter.WriteElementString("Name", ci.Name); 
xmlWriter.WriteElementString("LinkedParameter", ci.LinkedParameter?.ID); 

또는 사전 C# 6 사용

:

ci.LinkedParameter != null ? ci.LinkedParameter.ID : null; 
+0

좋아요, 당신 말이 맞아요. –

+0

@PartickHofman 나는 이것에 대해 몰랐고 완벽하게 보입니다 ... unfortunatly 나는 C# 4.5를 사용하고 있으며 현재 업그레이드 할 수 없습니다! : – TheGrovesy

+0

다음을 사용하십시오 :'ci.LinkedParameter! = null? ci.LinkedParameter.ID : null;'. –

0

사용 ci.LinkedParameter에 대한 간단한 테스트. ID로 문자열 :

if (!String.IsNullOrEmpty(ci.LinkedParameter.ID)) { 
    xmlWriter.WriteElementString("LinkedParameter", ci.LinkedParameter.ID); 
} 
else { 
    xmlWriter.WriteElementString("LinkedParameter", String.Empty); 
} 

간단한 사용 try-catch 블록 :

try { 
    xmlWriter.WriteElementString("LinkedParameter", ci.LinkedParameter.ID); 
} 
catch (e) { 
    xmlWriter.WriteElementString("LinkedParameter", String.Empty); 
} 

이러한 문은 모델의 작동을 변경하지 않으려는 경우에 적용됩니다. 당신은 C# 6 사용하지 않는 경우

+0

ID가 아닌'LinkedParameter'입니다. 어쨌든 NullReferenceException을 일으키지 않습니다. – stuartd

0

당신은 삼항 연산자를 사용할 수 있습니다

xmlWriter.WriteElementString("LinkedParameter", (ci.LinkedParameter != null) ? ci.LinkedParameter.ID : ""); 

그것은이의를 경우/다른하지만 ​​더 컴팩트하고이 같은 라인의 많은이있는 경우 더 우아한.

관련 문제