我有一个具有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中进行大小写检查。
答案 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"));