C# 关于将参数传递给返回Lambdas的方法的问题
(使用C#3.0和VS 2008) 在使用MVVM WPF时,您通常会编写如下属性:C# 关于将参数传递给返回Lambdas的方法的问题,c#,lambda,parameter-passing,C#,Lambda,Parameter Passing,(使用C#3.0和VS 2008) 在使用MVVM WPF时,您通常会编写如下属性: public bool MyProperty { get{return _myProperty;} set{ if(_myProperty == value)return; _myProperty = value; RaisePropertyChanged("MyProperty"); } } public class MyTestMet
public bool MyProperty {
get{return _myProperty;}
set{
if(_myProperty == value)return;
_myProperty = value;
RaisePropertyChanged("MyProperty");
}
}
public class MyTestMethods{
public static PropertyChangedEventHandler MakePropertyChangedHandler(
bool eventWasRaised, string propertyName){
return (s,e)=>{eventWasRaised = true; propertyName = e.PropertyName};
}
}
进行TDD时,我通常会编写测试,例如:
[Test]
public void MyPropertyRaisesPropertyChangedWhenChanged(){
var mySUT = CreateSUT();
bool eventRaised = false;
string propName = "";
mySUT.PropertyChanged +=
(s,e)=>{eventRaised = true;propName = e.PropertyName;};
Assert.That(mySUT.MyProperty,Is.False(),"mySUT.MyProperty");
mySUT.MyProperty = true;
Assert.That(eventRaised,"eventRaised");
Assert.That(propName, Is.EqualTo("MyProperty"),"propName");
// could check not raised when set same...
}
我尝试过这样一种方法:
public bool MyProperty {
get{return _myProperty;}
set{
if(_myProperty == value)return;
_myProperty = value;
RaisePropertyChanged("MyProperty");
}
}
public class MyTestMethods{
public static PropertyChangedEventHandler MakePropertyChangedHandler(
bool eventWasRaised, string propertyName){
return (s,e)=>{eventWasRaised = true; propertyName = e.PropertyName};
}
}
这样我就可以写我的测试了:
[Test]
public void MyPropertyRaisesPropertyChangedWhenChanged(){
var mySUT = CreateSUT();
bool eventRaised = false;
string propName = "";
mySUT.PropertyChanged +=
MyTestMethods.MakePropertyChangedHandler(eventRaised,propName);
// etc...
}
但是VS2008告诉我,eventRaised总是假的
我想也许将MakePropertyChangedHandler更改为使用ref参数会起作用
public static PropertyChangedEventHandler MakePropertyChangedHandler(
ref bool eventWasRaised, ref string propertyName){
return // lambda...
}
但VisualStudio告诉我“不能在匿名方法体中使用ref或out参数“x”
有谁能告诉我是否可以编写一个像MakePropertyChangedHandler这样的工作方法,如果没有,原因是什么?不可能为lambda提供ref,因为无法确保正确的生命周期管理。当编译器遇到闭包(lambda使用外部范围变量)时,它
class BoolHolder {
public bool value;
};
把布勒霍尔德传给lambda和lambda do
boolHolder.value = true;
您将看到外部的变化。有关这一问题的原因,请参阅@Justin,感谢您的链接。感谢您的有益解释和解决建议。