为什么将func <T>传递给构造函数而不是T?

Dan*_*ger 4 c# linq func

我在单元测试中遇到了关于处理DateTime.Now的问题的接受答案,其中包含以下代码示例:

private readonly Func<DateTime> _nowProvider;
public SomeClass(Func<DateTime> nowProvider)
{
    _nowProvider = nowProvider;
}

public bool Foo()
{
    return (_nowProvider().DayOfWeek == DayOfWeek.Sunday);
}
Run Code Online (Sandbox Code Playgroud)

实例化如下:

var s = new SomeClass(() => DateTime.Now);
Run Code Online (Sandbox Code Playgroud)

我Func<T>在C#中使用的并不多,所以我想我会看看它的Microsoft文档,它有以下几点:

您可以使用此委托表示可以作为参数传递的方法,而无需显式声明自定义委托.封装的方法必须对应于此委托定义的方法签名.这意味着封装的方法必须没有参数,并且必须返回一个值.

为什么在示例中传递一个Func<DateTime>实例化Class(() => DateTime.Now)的构造函数会更有益

而不是简单地传入一个DateTime实例化为Class(DateTime.Now)构造函数的参数?

根据上面提到的Microsoft文档,LINQ lambda构造函数也接受了Func<T>论证,我的经验证明它们非常灵活,但我不明白为什么?

Maf*_*fii 6

而不是简单地将实例化为Class(DateTime.Now)的DateTime参数传递给构造函数?

因为该值应该是当前的DateTime,而不是该类已实例化时的值.

当代码运行时,Func将返回执行代码的确切日期.

如果DateTime将存储在一个字段中,那么它将是创建的时间,而不是现在.


我有一个例子.

假设您Class在星期六23:59:55 创建了一个实例.

10秒后,以下剪辑:

(passedDateTime.DayOfWeek == DayOfWeek.Sunday); 
Run Code Online (Sandbox Code Playgroud)

将返回false.

使用提供程序,日期时间实际上是星期日 - 执行时间.


技术:

DateTime是一个结构.

将DateTime作为参数传递给方法或构造函数时,它将作为值传递,而不是作为引用传递.

因此,它DateTime不是最新的,而只是值的快照.

您可以自己确认:

var dateTime = DateTime.Now;

System.Threading.Sleep(1000);
bool equals = dateTime == DateTime.Now; // false
Run Code Online (Sandbox Code Playgroud)