为什么将lambda表达式赋给私有字段?

时间:2015-03-27 07:49:23

标签: c# lambda csla

我正在查看工作中的一些代码,并发现了一些我不熟悉的内容。

这里是我熟悉的完整属性:

private int myVar;
public int MyProperty
{
    get { return myVar; }
    set { myVar = value; }
}

然后我看到了(而且我无法回想起):

private int myVar = x => x.Something;

这是在使用CSLA的应用程序中找到的。

4 个答案:

答案 0 :(得分:1)

将lambda表达式用作变量(公共或私有)就像使用可以更改的函数一样。

例如我可以做这样的事情

var myFavoriteFunction = (x) => x.FirstFunction();

//do some work
myFavoriteFunction(someobject)

//now change the function
myFavoriteFunction = (x) => x.SecondFunction();

myFavoriteFunction(someobject)

在不知道您正在查看的代码的情况下,您可能会将其视为单击处理程序,并且单击该按钮时正在执行的功能可能会更改。 (当然是一个点击处理程序,你也可以采用不同的方式,但这不是重点)

答案 1 :(得分:1)

以这种方式使用表达式也称为属性选择器

正确的语法实际上是这样的。

private Expression<Func<Foo, int>> myVar = x => x.Something;

这些都有无数的用途,一个典型的例子就是避免使用硬编码&#34;成员名称,否则必须键入为字符串文字(编译器仍未选中,并且证明难以重构)。

这是本例的一个实际应用。

Implementing INotifyPropertyChanged - does a better way exist?

您还会在Fluent interface实施中看到这种情况,例如Fluent NHibernate

然而,随着C#6中nameof()表达式的出现,我们很快就会看到这种技术消失。

http://davefancher.com/2014/12/02/c-6-0-nameof-expressions/

答案 2 :(得分:1)

Biscuits写了关于属性(或字段)选择器的信息......这有两种用途:一种(他谈到的那种)来获取字段/属性的名称。

怎么做?

假设:

Expression<Func<Foo, int>> expression = x => x.Something;

你这样做:

string name = ((MemberExpression)expression.Body).Member.Name;

由其他人编写,在C#6.0中,由于nameof()(通常更快,因为它在编译时完成而不是在运行时)而在C#5.0中部分无用,这将变得几乎无用感谢[CallerMemberName]

第二个用途是通过传递Expression<>,这是一个&#34; getter&#34; (一个给对象返回某个东西的值的函数)给一个方法,该方法可以&#34; build&#34; a&#34; setter&#34;。

Func<Foo, int> getter = expression.Compile();

var parameter = Expression.Parameter(expression.ReturnType);

Action<Foo, int> setter = Expression.Lambda<Action<Foo, int>>(
    Expression.Assign(expression.Body, parameter ), 
    new[] { expression.Parameters[0], parameter }).Compile();

Foo foo = new Foo();
setter(foo, 5); // Example of use of the setter
int value = getter(foo); // Example of use of the getter

如果你必须使用一次设置器,这比使用直接反射慢得多(因为必须构建Expression,然后编译等等,以及在构建和编译时(但是Expression中没有使用反射)。但是如果你需要多次使用getter / setter,那么它会变得更快(如果你&#34;缓存&#34;它们),因为使用这种方式构建的getter / setter几乎和访问一样快直接属性/字段(缓慢的部分是创建getter / setter)

答案 3 :(得分:0)

您所看到的与财产无关,这是代表分配。 (类型可能不是int)

Func<int,int> doubleMyNumber = (i) => 2 * i;

这就像委托一样,写成匿名函数。更多信息请访问:https://msdn.microsoft.com/fr-fr/library/bb397687.aspx

在C#6中,您将能够看到像这样的奇怪的符号

public int AgeInDogYears() => Age * 7;

您将能够将方法的主体编写为lambda表达式。 http://csharp.2000things.com/2014/11/03/1217-using-lambda-expressions-for-function-members/