【问题标题】:DateTime? AddDays Extension Method约会时间? AddDays 扩展方法
【发布时间】:2015-01-20 03:51:03
【问题描述】:

我想编写一个扩展方法,将一天添加到 Nullable DateTime,但修改日期本身。

我想按如下方式使用:

someDate.AddOneDay();

这直接改变了 someDate 的值。

我最初写的代码是:

public static DateTime? AddOneDay(this DateTime? date)
{
    if (date.HasValue)
    {
        date.Value = date.Value.AddDays(1);
    }

    return null;
}   

但这不起作用,因为引用已更改,因此以这种方式调用它 不会改变 someDate 的值。

有没有办法实现这一点并避免以下代码:

someDate = someDate.AddOneDay();

我也在考虑一些 DateTime 属性的设置器,但它们没有任何..

public int Day { get; }
public int Month { get; }
public int Year { get; }

【问题讨论】:

  • 我不会那样做......
  • DateTime 是 .NET Framework 中的 immutable type。你不能改变它。正如您在代码中看到的那样,您分配了 date.Value 属性 date.Value.AddDays(1) 返回的内容。
  • 所以你的目标是迷惑任何可能误读你的代码并将其误认为标准内置功能的人?
  • 不,我想节省我写 someDate = someDate.HasValue 的时间? someDate.AddDays(1) : null;去很多地方:) @Damien_The_Unbeliever
  • @gyosifov 如果你在很多地方都有这样的代码,也许你需要重新考虑你的设计。如果代码有异味,请接受提示;)

标签: c# datetime extension-methods


【解决方案1】:

你不能 DateTime 是不可变的,应该保持不变。

只要做:

someDate = someDate.AddOneDay();

如果你想更具体,你可以将你的函数重命名为:

DateTime? someDate = someDate.AddOneDayOrDefault();

【讨论】:

    【解决方案2】:

    老派%)

    public static void AddOneDay(ref DateTime date)
    {
        if (date != null) date = date.AddDays(1);
    }
    

    用法:

    DateTime date = DateTime.Now;
    AddOneDay(ref date);
    

    更新

    方法的一行版本:

    public static void AddOneDay(ref DateTime date) { date = date.AddDays(1); }
    

    【讨论】:

    • if (date != null) 检查是多余的:DateTime 是一个不可为空的结构,所以总是有一个值,因此总是!= null
    【解决方案3】:

    C# 确实支持类似的功能,即使对于可变值也是如此,即在可空值上使用 +=

    DateTime? date = GetDate();
    var oneDay = TimeSpan.FromDays(1);
    date += oneDay;
    

    【讨论】:

    • 您刚刚在单行解决方案中添加了 2 行代码,它的作用完全相同,只是现在更难发现您正在尝试做什么。
    • 这不会改变日期的值,它会引用另一个,所以这几乎不能回答 OP 的问题。
    • @André - 将一天添加到可为空的 DateTime 的单行解决方案是什么?此外,这只是显示该功能。如果您想在任何地方使用它,您可能希望 oneDay 成为一个公共值,并且您可以从任何地方访问它。
    • @HimBromBeere - 这是错误的。 DateTime 不是引用类型,所以它不能“引用另一个”,它会改变本地变量date 的值。
    • @Kobi 是的,拥有一个具有静态全局值的上帝对象肯定是要走的路。扩展方法的存在是有原因的,可以轻松扩展代码,从而避免像您建议的那样复制粘贴。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多