我应该将对象或 Func/Action 传递给 C# 中的方法吗

问题描述 投票:0回答:1

传递简单的普通对象或返回相同对象的 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)

c# .net delegates
1个回答
0
投票

传递简单的普通对象或返回相同对象的 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);

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.