C# 静态或实例c

C# 静态或实例c,c#,static-methods,instance-methods,C#,Static Methods,Instance Methods,我有一个最佳实践问题。 我有一个BuildTourTime方法,它接受一个DateTime和一个表示时间的字符串 internal DateTime BuildDateTime(DateTime date, string time) { return date.Add(TimeSpan.Parse(time)); } 我将在多个位置使用它。目前它正在另一个类中使用 private IEnumerable<Tour> BuildTours(Resp

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


编辑:为什么投票被否决?我在发布此问题之前阅读的链接没有回答我的问题。我的问题表明,我已经调查了我可以使用的选项,并提出了确切的问题,还提供了相关代码。

您可以使用扩展方法:

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

    }
}
通过这种方式,只要添加使用名称空间,就可以从任何地方调用它

// 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;
}

是的,如果需要在许多地方使用它,则生成静态方法并生成静态助手类。该方法似乎非常适合datetime类型的扩展方法。为什么要使用静态方法调用来替换单行代码?示例中未使用BuildDateTime。参数time是时间跨度,而不是日期时间。您的示例呼叫需要编辑。@KeithPayne yes在您添加comment@Steve谢谢你在这方面的帮助。但愿我能把两个问题标对。我想J是第一个进去的,没问题。重要的是得到正确的答案。下次我将直接写下答案,而不是写评论-+1,扩展方法对于方法的简单程度很有意义。我可能会称之为AddTime,而不是BuildDateTime,只是需要考虑一下。我喜欢这个。如果它只在一个项目中使用,这是不是太过分了?1中的多个位置project@AndrewMacNaughton我不这么认为;是在项目中还是在特定的地方?请阅读以下内容: