c#如果语句块执行,即使是假

时间:2016-06-28 04:30:15

标签: c# datetime if-statement

所以我从Google日历活动中获取了活动数据。我有一个类item的变量Google.Apis.Calendar.v3.Data.Event。有一个名为Start的属性,即偶数开始时。如果在一天的特定时间设置,则Start.DateTime将具有值。如果它是一个全天事件,则Start.DateTime将为空,并且它将具有单独的属性Start.Date,由于某种原因这是一个字符串。如果Start.DateTime没有值,我希望Start.Date值为{1}}。这是相关代码:

if (item.Start.DateTime.HasValue)
                {
                    newEvent.Start = (DateTime)item.Start.DateTime;
                    newEvent.End = (DateTime)item.End.DateTime;
                } else
                {
                    string StartDay = item.Start.Date;
                    string EndDay = item.End.Date;
                }

因此,当我在具有常规DateTime的日期运行它时,我看到了:

DateTime.HasValue is true

它为NewEvent.Start分配一个值。大。

现在我使用Start.DateTime为null的全天事件运行它:

DateTime.HasValue is false

所以它应该跳到else语句,但它没有:

Start still gets a value

即使条件为false,newEvent.Start仍会被赋值。并且else语句没有被执行。发生了什么事?

4 个答案:

答案 0 :(得分:4)

因为var email = 'Lorem ipsum <a href="http://www.example.com/09D623" target="blank" style="color: #66BB12;">dolor sit</a> amet, 09D623 non pulvinar nunc egestas. Nunc sit amet imperdiet 09D623 magnat.'; var modded = email.replace(/(\s\d+[A-Z]+\d+\s)/g, "<strong>$1</strong>"); document.write(modded); 是值类型,所以它不能具有非值。因此,您在调试器中看到的只是它的默认值,但是不执行if语句。只有调试器显示变量的任何,因为它无法显示DateTime。显然,您的会员nullStart,而DateTime则返回item.Start

当你在DateTime?中的语句中放入一个断点时,你会发现它永远不会被执行。只有调试器正在创建此值,没有任何内容分配给您的变量 - 除了它的默认值,显然是定义变量时的1月1日。因此,无论您定义if,这都是设置此默认值的行 - 而不是newEvent - 语句。

答案 1 :(得分:1)

按预期跳过代码。但是newEvent.Start无论如何都有一个值,可能是因为它是DateTime类型,不能为null。

答案 2 :(得分:1)

这是DataTime类型的默认值。您可以将Nullable DataTime用于您的目的。

DateTime? d = null;
bool boolNotSet = d.HasValue;

答案 3 :(得分:0)

DateTime是C#中的结构;这样做的一个结果是它的成员变量总是被初始化,在这种情况下是值1/1/0001 12:00:00 AM,它也等于DateTime.MinValuedefault(DateTime)。另一个结果是结构按值传递,不能为空。

如果你想拥有一个DateTime&#34; null&#34;州,您可能想在事件类中使用Nullable<T>(或简写?):

public class NewEvent {
    public DateTime? Start { get; set; }
    public DateTime? End { get; set; }
}

Nullable<T>为您提供HasValue属性,以检查对象是否已分配值。