对象已初始化但仍为null

时间:2016-09-30 05:38:22

标签: c#

我有一个生产代码抛出异常

myObj.itsProperty= 1; 
  

System.NullReferenceException:未将对象引用设置为实例   一个对象。在   name.Extensions.Ads.Payload.ThisExtensions.ToMyLog(MyModel myModel,   MyOwnModel myOwnModel)中   D:\ name \ Extensions \ Ads \ Payload \ ThisExtensions.cs:第197行

在本地代码中,强制执行此操作的唯一方法是将断点放在那里并手动将myObj更改为null。

但是根据代码流程,这应该已经初始化了......

我不完全确定发生了什么以及如何发生这种情况。有没有办法解释这一点,或者可能加强代码来防止这种情况?

public static MyModel ToMyLog(this MyModel myModel, MyOwnModel myOwnModel)
{
    DateTime currentTime = DateTime.Now;
    MyModel myObj =
        new MyModel
        {
            SomeID = 1
            InsertedDate = currentTime,
            UpdatedDate = currentTime
        };

    if (myModel.somePropertiesModel.someProperty.Count >= 1)
    {
        myObj.itsProperty = 1; //itsProperty is a byte type
    }

MyModel类

  public class MyModel 
    {
        ///<summary>
        /// itsProperty
        ///</summary>
        public byte itsProperty{ get; set; }

1 个答案:

答案 0 :(得分:2)

很可能myModel是null但不是myObj。在方法的开头添加

if(myModel?.somePropertiesModel?.someProperty==null)
  throw new ArgumentNullException("myModel");

它相当于

if(myModel==null || myModel.somePropertiesModel==null || myModel.somePropertiesModel.someProperty==null)
  throw new ArgumentNullException("myModel");

或者将其拆分为3个检查并使用具体信息抛出异常,该对象为空

if (myModel == null)
    throw new ArgumentNullException("myModel");
if (myModel.somePropertiesModel == null)
    throw new ArgumentNullException("myModel.somePropertiesModel");
if (myModel.somePropertiesModel.someProperty == null)
    throw new ArgumentNullException("myModel.somePropertiesModel.someProperty");

此外,如果它内部有一些工作,它的可能性会产生此异常