【问题标题】:Static or Instance c#静态或实例 c#
【发布时间】:2014-10-24 17:13:39
【问题描述】:

我有一个最佳实践问题。 我有一个方法BuildTourTime,它接受一个日期时间和一个表示时间的字符串。

 internal DateTime BuildDateTime(DateTime date, string time)
    {
        return date.Add(TimeSpan.Parse(time));

    }

我将在多个位置使用它。目前它正在另一个类中使用

private IEnumerable<Tour> BuildTours(Response Data)
        {
            //Tour tour = new Tour();
            List<Tour> tours = new List<Tour>();
            foreach(Events ivEvents in Data.response.events)
            {
                bool isCancelled = true; //Replace this with logic
                tours.Add(new Tour(ivEvents.Id,Data.response.ID,Data.response.Title,BuildDateTime(ivEvents.Date,ivEvent.Start),isCancelled,ivEvents.Quantity-ivEvents.Remaining).);
            }
            return tours;
        }

我目前有 Tour 类,但没有无参数构造函数。据我所知,我有几个选择。将 BuildDateTime 声明为静态。或者为 Tour 添加一个无参数的构造函数。或者创建一个助手类并放入 BuildDateTime。这是使用静态方法的好地方吗?这就是我所倾向于的。

编辑:为什么投反对票?发布的链接(我在发布这个问题之前阅读过)没有回答我的问题。我的问题表明我已经调查了我可以使用的选项,并且我提出了一个确切的问题,并提供了相关代码。

【问题讨论】:

  • 是的,如果它需要在许多地方使用,制作静态方法并制作一个静态帮助类
  • 该方法似乎非常适合日期时间类型的扩展方法
  • 为什么要用静态方法调用来替换一行代码?
  • BuildDateTime 未在示例中使用。

标签: c# static-methods instance-methods


【解决方案1】:

你可以做扩展方法:

internal static class DateTimeExtension
{
    internal static DateTime BuildDateTime(this DateTime date, string time)
    {
        return date.Add(TimeSpan.Parse(time));
    }
}

并使用它:

string time = ...
DateTime date = ...
date.BuildDateTime(time);

【讨论】:

  • +1,扩展方法对于该方法的简单程度是有意义的。我可能会称它为 .AddTime 而不是 BuildDateTime,只是需要考虑一下。
  • 我喜欢这个。如果它只用于 1 个项目,是不是有点矫枉过正? 1 个项目中的多个地点
  • @AndrewMacNaughton 我不这么认为;)它是在一个项目中还是在特定的地方?阅读:msdn.microsoft.com/en-us//library/bb383977.aspx
【解决方案2】:

您的方法似乎并不特定于该类,但其他所有类都可以通用。这似乎是 DateTime 结构的扩展方法的完美示例

public static class MyDateExtensions
{
    public static DateTime BuildDateTime(this DateTime date, string time)
    {
        return date.Add(TimeSpan.Parse(time));

    }
}

通过这种方式,您可以从任何地方调用它(前提是您添加了 using 命名空间)

// Addin a day plus one hour
DateTime newDate = DateTime.Now.BuildDateTime("01:01:00:00");

话说,当 DateTime.Add 只是一行代码且没有任何复杂隐藏的情况下,使用这种方法似乎有点夸张

DateTime newDate = DateTime.Now.Add(TimeSpan.Parse("01:01:00:00"));

如果您不确定解析接收的输入,则应该首选扩展方法。例如,这可能是一种更安全的方法,但它很大程度上取决于如果时间字符串无效,您希望发生什么。如果时间字符串无效,许多人更喜欢获取异常,而不是阻止异常并返回预定义的结果。

public static DateTime BuildDateTime(this DateTime date, string time)
{
    if(string.IsNullOrWhiteSpace(time))
        return date; 

    TimeSpan ts;
    if(TimeSpan.TryParse(time, out ts))
        return date.Add(ts);
    else 
        return date;
}

【讨论】:

  • 参数timeTimeSpan,而不是DateTime。您的示例调用需要编辑。
  • @KeithPayne 是的,在您添加评论时已注意到并已修复
  • @Steve 感谢您的帮助。希望我能将两个问题标记为正确。认为 J 先进入。
  • 没有问题。重要的是得到正确的答案。下次我将直接写答案,而不是写 cmets。 :-)
猜你喜欢
  • 2010-10-31
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 2010-10-05
  • 2012-11-12
  • 1970-01-01
相关资源
最近更新 更多