我正在查看工作中的一些代码,并发现了一些我不熟悉的内容。
这里是我熟悉的完整属性:
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
然后我看到了(而且我无法回想起):
private int myVar = x => x.Something;
这是在使用CSLA的应用程序中找到的。
答案 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()
表达式的出现,我们很快就会看到这种技术消失。
答案 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/