[C#] C #에서 개체가 null인지 확인

객체가 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입니다 nulldataList.

당신은 하나를 만들어야합니다

public List<Object> dataList = new List<Object>();

더 낫습니다 private. 필드이기 때문에 확인하십시오 . 그리고 당신을 방해하는 것이 없다면, 또한 그것을 만드십시오 readonly. 좋은 습관이야

곁에

무효 여부를 확인하는 올바른 방법은 if(data != null)입니다. 이러한 종류의 점검은 참조 유형에 대해 어디에나 있습니다. 심지어 Nullable<T>표현하는 더 편리한 방법이 항등 연산자를 대체 nullable.HasValue무효 확인시.

그렇게 if(!data.Equals(null))하면 NullReferenceExceptionif 을 얻게 됩니다 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 인 경우 NullReferenceExceptionEquals메소드 를 호출하려고하면 프로그램이 중단 됩니다 null. 또한 참조 평등을 구체적으로 확인하려면 구현 Object.ReferenceEquals방법 Equals을 알 수 없으므로이 방법을 사용해야합니다 .

프로그램을 dataList초기화하지 않아서 널 이므로 프로그램이 충돌 합니다.


답변

이 경우의 문제 data는 null 이 아닙니다 . 그 dataList자체는 null입니다.

선언하는 곳에 dataListList객체를 만들어 변수에 할당해야합니다.

List<object> dataList = new List<object>();