如果某个值为null,如何保留未声明的变量?

时间:2013-06-17 14:54:07

标签: c#

代码行如下所示:

ActiveEndDate = item[BuiltInFieldId.ActiveEndDate] != null ? 
DateTime.Parse(item[BuiltInFieldId.ActiveEndDate].ToString()) : (DateTime?)null

我如何确保item[BuiltInFieldId.ActiveEndDate]null声明它,否则不要向ActiveEndDate变量声明任何内容,甚至不null

必须在对象初始化期间

这是所请求的周围代码:

      var result = new Xannounce
                {

                    MyX = (
                        from item in items.Cast<SPListItem>()
                        from ta in (item[FieldId.x] as string ?? "").Replace(";", string.Empty).Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
                        where audienceIds.Select(x => x.xID).Contains(ta)
                        select new Xannounce
                            {
                                Xid = item.ID,
                                Xpub = item[BuiltInFieldId.ResponsiblePublisher] as string ?? string.Empty,
                                XformUrl = item.ParentList.DefaultEditFormUrl,
                                ActiveEndDate = item[BuiltInFieldId.ActiveEndDate] != null ? DateTime.Parse(item[BuiltInFieldId.ActiveEndDate].ToString()) : (DateTime?)null,
                                ActiveStartDate = item[BuiltInFieldId.ActiveStartDate] != null ? DateTime.Parse(item[BuiltInFieldId.ActiveStartDate].ToString()) : (DateTime?)null,
                                XEndDate = item[BuiltInFieldId.EndDate] != null ? DateTime.Parse(item[BuiltInFieldId.EndDate].ToString()) : (DateTime?)null,
                                XStartDate = item[BuiltInFieldId.StartDate] != null ? DateTime.Parse(item[BuiltInFieldId.StartDate].ToString()) : (DateTime?)null,
                                XTitle = item[SPBuiltInFieldId.Title].ToString(),
                                XMessage = item[SPBuiltInFieldId.Body] != null ? item[SPBuiltInFieldId.Body].ToString() : string.Empty,
                                Xtype = new SPFieldLookupValue(item[BuiltInFieldId.AnnouncementType].ToString()).LookupId,
                                XAuthor = item[SPBuiltInFieldId.Author].ToString(),
                                XAudienceNames = AudienceUtility.FindAudiences(item[FieldId.AudienceTargeting].ToString(), SPServiceContext.Current).Select(y => ' ' + y.AudienceName).ToArray()
                            }),
// Code continues...

任何形式的帮助或提示都很受欢迎

3 个答案:

答案 0 :(得分:5)

如何不使用三元运算符?

if(item[BuiltInFieldId.ActiveEndDate] != null){
          ActiveEndDate =  item[BuiltInFieldId.ActiveEndDate];
}

答案 1 :(得分:3)

您可以将ActiveEndDate分配给自己,只要没有附加在您的财产上的奇怪副作用,就会产生与无所事事相同的结果。另外,通过读取代码,只调用.ToString()来重新解析它。这似乎是一个坏主意。如果表达式已经是日期时间,请使用它。如果不是,请不要调用.ToString()。假设它是一个DateTime,您现有的代码简化为:

ActiveEndDate = item[BuiltInFieldId.ActiveEndDate] ?? ActiveEndDate;

如果是别的,你可以这样做:

ActiveEndDate = item[BuiltInFieldId.ActiveEndDate] != null ? DateTime.Parse(item[BuiltInFieldId.ActiveEndDate].ToString()) : ActiveEndDate;

您可能会发现有用的最后一点语法是default关键字:

ActiveEndDate = item[BuiltInFieldId.ActiveEndDate] ?? default(DateTime);

请注意,DateTime表达式(不是DateTime?)的默认值为1/1/1900DateTime?的默认值为null。

我尚未涉及的另一个问题是DBNull。如果你的item变量是某种类型的IDataRecord(SqlDataReader,DataRow等),你可能正在处理DBNull,这可能会引发纠结我的其他选项。这也可以解释为什么你在这里调用.ToString(),因为.ToString()以比其他选项更健全的方式处理DBNull。如果你在数据库中有一个字符串类型(如varchar),这很好,但是当处理日期和数字等其他类型时,当你实际拥有一个值时,它仍然是倒退的(希望更常见)。

在这种情况下,我建议首先检查一个简单的if () {}块,如已在另一个答案中发布的那样。如果你正在进行对象初始化(正如对另一个答案的评论所建议的那样),事情开始变得复杂。现在我们有很多逻辑必须全部适合单个表达式,以处理nullDBNull和值的情况。如果那是你的情况,我会用这个:

ActiveEndDate = (item[BuiltInFieldId.ActiveEndDate] == DBNull.Value?null:item[BuiltInFieldId.ActiveEndDate]) ?? ActiveEndDate

答案 2 :(得分:0)

将三元组扩展为if语句:

if (item[BuiltInFieldId.ActiveEndDate] != null) {
  ActiveEndDate = item[BuiltInFieldId.ActiveEndDate];
}

非常确定ActiveEndDate无论如何都会默认为DateTime.MinValue(1/1/0001 12:00:00 AM)。