这两个函数调用之间的区别

时间:2017-05-20 15:59:24

标签: c# asp.net delegates

使用Func关键字专门学习代理,并注意到我可以用两种不同的方式进行相同的函数调用。

public class TestClass
{
    public string Name { get; set; }
    public string Description { get; set; }

    /// <summary>
    ///     Creates a SelectListItem
    /// </summary>
    /// <param name="function">Function which retrieves the data to populate the list</param>
    /// <param name="key">The column name which contains the index/uniqueidentifier which is used to identify the object</param>
    /// <param name="displayText">Column name for the text that will appear on the dropdown list</param>
    /// <returns> A List of SelectListItem</returns>

    public static List<SelectListItem> CreateList<T>(Func<List<T>> function, string key, string displayText)
    {
        var list = new List<SelectListItem>();
        var model = function();
        foreach (var item in model)
        {
            var property = item.GetType().GetProperty(key);
            var text = item.GetType().GetProperty(displayText);
            if (property != null && text != null)
            {
                list.Add(new SelectListItem()
                {
                    Text = text.GetValue(item, null).ToString(),
                    Value = property.GetValue(item, null).ToString()
                });
            }
        }
        return list;
    }
    public  List<TestClass> GetList()
    {
        List<TestClass> test = new List<TestClass>();
        var t = new TestClass
        {
            Name = "T",
            Description = "P"
        };
        test.Add(t);
        return test;
    }

}

叫做:

var obj = new TestClass();

TestClass.CreateList(() => obj.GetList(), "Name", "Description");
TestClass.CreateList(obj.GetList, "Name", "Description");

他们的召唤方式有什么不同吗?它们似乎都以完全相同的方式运行,它们之间是否存在效率差异? 解释将不胜感激: - )

2 个答案:

答案 0 :(得分:1)

该参数需要一个函数。

这传递了这个功能。

TestClass.CreateList(obj.GetList, "Name", "Description");

这会传递一个调用该函数的匿名函数。

TestClass.CreateList(() => obj.GetList(), "Name", "Description");

第二个的附加语法是不必要的。 Resharper将提供用第一个替换第二个。

答案 1 :(得分:0)

在第一种情况下,您传递Lambda expression,而在第二种情况下传递functiondelegate。效率没有差别。

  

=&gt; token被称为lambda运算符。它用于lambda   表达式将左侧的输入变量与   lambda身体在右侧。 Lambda表达式是内联的   表达式类似于匿名方法但更灵活;他们是   广泛用于以方法语法表示的LINQ查询中   来源MSDN

     

委托是一种可用于封装命名的引用类型   或匿名方法。委托类似于函数指针   C ++;但是,代表们是类型安全且安全的。适用于   代表们,请参阅代表和通用代表。   来源MSDN

您可以在delegates-actions-funcs-lambdaskeeping-it-super-simple

了解这些差异