传递简单的普通对象或返回相同对象的 lambda 函数之间有什么区别,以及在性能/可读性方面选择哪个选项?
给定一个示例类,我不明白在哪些情况下应该选择使方法需要 Func/Action 参数,而不仅仅是它返回的对象,而大多数时候只使用简单的内联 lambda 函数.
public static class TestClass
{
public static void someOperation<T>(Func<T> test) where T : notnull
{
var x = test.Invoke();
Console.WriteLine(x.ToString());
}
public static void someOperation<T>(T test) where T : notnull
{
Console.WriteLine(test.ToString());
}
public static void someOperationOnString(Func<string> test)
{
string x = test.Invoke();
Console.WriteLine(x);
}
public static void someOperationOnString(string test)
{
Console.WriteLine(test);
}
}
TestClass.someOperation(() => "Hello, World!"); // Hello, World!
TestClass.someOperation("Hello, World!"); // Hello, World!
TestClass.someOperation(() => 1); // 1
TestClass.someOperation(() => new { test = "some test" }); // { test = some test }
TestClass.someOperationOnString(() => "my random string"); // my random string
TestClass.someOperationOnString("my random string"); // my random string
我知道 Func 将在方法调用之后被调用,但基本上在这两种情况下都会调用它,因此在性能方面不应该有任何差异。 我还注意到许多库/框架使用 Func 选项,但我不明白其优点以及何时选择其中之一。 (例如 Asp.net Core)
传递简单的普通对象或返回相同对象的 lambda 函数之间存在任何差异
主要区别在于使用 lambda 更加抽象。您可以根据需要生成对象,从而避免在实际上不需要该对象时可能进行昂贵的初始化。或者您可以在每次调用时生成不同的对象。
在性能/可读性方面选择哪个选项?
使用最简单、最不抽象的选项来满足您的要求。一般来说,您应该尽量避免“不必要的”抽象以提高可读性。困难在于知道什么抽象是必要的,或者将成为必要的。
给定一个示例类,我不明白在哪些情况下应该选择使方法需要 Func/Action 参数,而不仅仅是它返回的对象,而大多数时候只使用简单的内联 lambda 函数在这个特定的示例中,所有替代方案都执行完全相同的操作,因此在这种特定情况下最简单和最好的选择是使用常规字符串:
public static void someOperationOnString(string test)
{
Console.WriteLine(test);
}
TestClass.someOperationOnString("my random string"); // my random string
或者,如果您希望能够打印任意类型:
public static void someOperation<T>(T test) where T : notnull
{
Console.WriteLine(test.ToString());
}
TestClass.someOperation(1);