객체가 null 인 경우 추가 처리를 방지하고 싶습니다.
다음 코드에서 객체가 null인지 확인합니다.
if (!data.Equals(null))
과
if (data != null)
그러나에 메시지가 표시 NullReferenceException
됩니다 dataList.Add(data)
. 오브젝트가 널 (NULL) 인 경우, if
-statement를 입력하지 않아야합니다!
따라서 객체가 null인지 확인하는 적절한 방법인지 묻습니다.
public List<Object> dataList;
public bool AddData(ref Object data)
bool success = false;
try
{
// I've also used "if (data != null)" which hasn't worked either
if (!data.Equals(null))
{
//NullReferenceException occurs here ...
dataList.Add(data);
success = doOtherStuff(data);
}
}
catch (Exception e)
{
throw new Exception(e.ToString());
}
return success;
}
이것이 객체가 null인지 확인하는 올바른 방법이라면 내가 뭘 잘못하고 있습니까 (NullReferenceException을 피하기 위해 객체에서 추가 처리를 방지하려면 어떻게해야합니까?)
답변
그것은 아니에요 data
입니다 null
만 dataList
.
당신은 하나를 만들어야합니다
public List<Object> dataList = new List<Object>();
더 낫습니다 private
. 필드이기 때문에 확인하십시오 . 그리고 당신을 방해하는 것이 없다면, 또한 그것을 만드십시오 readonly
. 좋은 습관이야
곁에
무효 여부를 확인하는 올바른 방법은 if(data != null)
입니다. 이러한 종류의 점검은 참조 유형에 대해 어디에나 있습니다. 심지어 Nullable<T>
표현하는 더 편리한 방법이 항등 연산자를 대체 nullable.HasValue
무효 확인시.
그렇게 if(!data.Equals(null))
하면 NullReferenceException
if 을 얻게 됩니다 data == null
. 이 예외를 피한 것이 처음부터 목표 였기 때문에 코믹한 것입니다.
당신은 또한 이것을하고 있습니다 :
catch (Exception e)
{
throw new Exception(e.ToString());
}
이것은 확실히 좋지 않습니다. 메서드 안에 여전히있는 동안 디버거에 침입 할 수 있으므로이 단락을 무시한다고 생각할 수 있습니다. 그렇지 않으면 아무것도 예외를 포착하지 마십시오. 그리고 그렇게하면 just을 사용하여 다시 던지십시오 throw;
.
답변
C #> 7.0에서
if (obj is null)
…
객체에 의해 정의 된 == 또는! =를 무시합니다 (물론 사용하려는 경우가 아니면 …)
null이 아닌 경우 if (obj is object)
(또는 if (!(obj is null))
)
답변
C # 6에는 monadic null 점검이 있습니다. 🙂
전에:
if (points != null) {
var next = points.FirstOrDefault();
if (next != null && next.X != null) return next.X;
}
return -1;
후:
var bestValue = points?.FirstOrDefault()?.X ?? -1;
답변
dataList는 인스턴스화되지 않았으므로 게시 한 코드로 판단하여 null입니다.
시험:
public List<Object> dataList = new List<Object>();
public bool AddData(ref Object data)
bool success = false;
try
{
if (!data.Equals(null)) // I've also used if(data != null) which hasn't worked either
{
dataList.Add(data); //NullReferenceException occurs here
success = doOtherStuff(data);
}
}
catch (Exception e)
{
throw new Exception(e.ToString());
}
return success;
}
답변
[@ kelton52의 힌트를 반영하도록 편집]
가장 간단한 방법은 object.ReferenceEquals(null, data)
이후 (null==data)
작동하지 않을 수있다 :
class Nully
{
public static bool operator ==(Nully n, object o)
{
Console.WriteLine("Comparing '" + n + "' with '" + o + "'");
return true;
}
public static bool operator !=(Nully n, object o) { return !(n==o); }
}
void Main()
{
var data = new Nully();
Console.WriteLine(null == data);
Console.WriteLine(object.ReferenceEquals(null, data));
}
생산 :
” ‘Nully’와 비교
진실
그릇된
답변
아니요,을 사용해야합니다 !=
. data
실제로 null 인 경우 NullReferenceException
에 Equals
메소드 를 호출하려고하면 프로그램이 중단 됩니다 null
. 또한 참조 평등을 구체적으로 확인하려면 구현 Object.ReferenceEquals
방법 Equals
을 알 수 없으므로이 방법을 사용해야합니다 .
프로그램을 dataList
초기화하지 않아서 널 이므로 프로그램이 충돌 합니다.
답변
이 경우의 문제 data
는 null 이 아닙니다 . 그 dataList
자체는 null입니다.
선언하는 곳에 dataList
새 List
객체를 만들어 변수에 할당해야합니다.
List<object> dataList = new List<object>();