静态或实例c#

本文关键字:实例 静态 | 更新日期: 2023-09-27 18:27:41

我有一个最佳实践问题。我有一个方法BuildTourTime,它采用DateTime和一个表示时间的字符串。

 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。这是一个使用静态方法的好地方吗?这就是我所倾向的。

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

静态或实例c#

您可以执行扩展方法:

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);

您的方法似乎并不特定于该类,但可以被其他所有类通用。这似乎是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;
}