初始化时或初始化后是否应该分配对象属性?

时间:2018-10-26 16:16:18

标签: c#

我有一个具有11个属性的对象obj1。 这样做更好吗?

Obj obj1 = new Obj()
{
 prop1 = int.Parse(data.Rows[0]["RequestId"].ToString())
 prop2 = IsBoss = (bool)data.Rows[0]["IsBoss"]
///etc...
}

或者我应该做

{
 Obj obj1 = new Obj(){}
 obj1.prop1 = int.Parse(data.Rows[0]["RequestId"].ToString())
 obj1.prop2 = IsBoss = (bool)data.Rows[0]["IsBoss"]
///etc...
}

还有一个附带的问题,当我的数据行为null时,将引发异常“输入字符串的格式不正确”,因为数据库中的字段为null。通常,数据不会为空,但是最好使用三元运算符检查是否为空,或者我应该在sql qry中进行大小写检查。

2 个答案:

答案 0 :(得分:0)

我更喜欢按照第一个示例在初始化时设置对象属性,我认为代码看起来更清晰,包含的更好,但这更多是个人喜好。

对于第二个问题,当从数据库返回数据为空时,您有一些选择。

{
    var obj1 = new Obj()
    {
        prop1 = int.TryParse(data.Rows[0]["RequestId"]?.ToString(), out int val) ? val : -1,
        prop2 = IsBoss = bool.TryParse(data.Rows[0]["IsBoss"].ToString(), out bool isBoss) ? isBoss : false
    }
}

还没有测试过,但是类似的东西应该可以工作,但是它并不干净。我将解析分为自己的方法或块。为了使代码更轻松一些。

类似这样的东西:

{
   if(!(int.TryParse(data.Rows[0]["RequestId"]?.ToString(), out int requestId)))
    {
        requestId = -1;
    }

    bool.TryParse(data.Rows[0]["IsBoss"]?.ToString(), out IsBoss);

    var obj1 = new Obj()
    {
        prop1 = requestId,
        prop2 = IsBoss
    }
}

答案 1 :(得分:0)

与其他答案一样,如何实例化对象由您决定。我个人曾经实例化它们,并在一条语句中分配了所有属性。我一直遇到的问题是,当a的某个属性无法将其从数据库中恢复过来时(例如您的null exception场景),该异常不会为我提供准确的行号。因此,我将实例化为对象,然后分配属性。这样,您将确切地知道引起该问题的线路/属性。

MyClass obj = new MyClass();
obj.PropertyOne = "";
obj.PropertyTwo = "";
//etc...

关于您的第二个问题,我将三元组与nulls上的IsDBNull()方法结合使用来处理DataTableReader

 MyClass obj = new MyClass();
 obj.PropertyOne = rdr.IsDBNull(rdr.GetOrdinal("RequestId")) ? 0 
                      : rdr.GetInt32(rdr.GetOrdinal("RequestId"));