代码重构之没有理由拒绝Lambda表达式
代碼重構之沒有理由拒絕Lambda表達式
?
Lambda表示是在C# 3.0推出的新特性,而匿名方法是C# 2.0推出的新特性,這一切都是為了讓代碼變得更簡潔,更容易理解。
?
最近開始做一些Silverlight的應用項目,發現在Silverlight和后臺代碼交互時大量使用的是異步回調的方式;而異步處理特別是需要有返回結果,比如調用webService返回數據,哪怕是一個普通的Event事件處理,通常情況下都要寫不少代碼,定義委托類型,回調方法等。
如果熟練的開發人員對.net framework每個版本有所了解一定會使用Lambda表示來簡化這些代碼。
?
下面就簡單的說明一下如何使用Lambda表達式來重構你的代碼
?
Button.Click事件開始
?
通常的寫法(C# 1.0)
this.button.Click +=new EventHandler(button_Click);
?
?
void button_Click(object sender, EventArgs e)
{
???? throw new NotImplementedException();
}
?
以上代碼在C# 2.0(匿名方法)可以重構成
this.button.Click +=delegate{
throw new NotImplementedException();
};
//或者
this.button.Click +=delegate(object obj, EventArgs args){
throw new NotImplementedException();
};
?
使用Lambda表達式重構
//Lamdba
this.button.Click += (s, ev) => { throw new NotImplementedException(); };
?
從中我們可以看出Lambda表達式可以讓你的代碼更加簡潔,可讀性更好。
通過上面的例子應該很容易可以發現很多事件,委托都可以用Lambda表達式重構
?
Func<int, int > max = delegate(int a, int b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
};
等價于
Func<int, int> max = (a, b) =>
{
if (a > b)
{
return a;
}
else
{
return b;
}
};
?
Lambda表達式語法
?
(參數列表)=〉表達式或語句塊
"=〉"推導符號
?
WCF Client異步回調如何重構
?
通常的寫法如下
?
ServiceClient webService = new ContactServiceClient("binaryBinding");
webService.GetContactByLastNameCompleted += new EventHandler< GetContactByLastNameCompletedEventArgs>(webService_GetContactByLastNameCompleted);
webService.GetContactByLastNameAsync(this.lastNameTextBox.Text);
this.act.IsActive = true;
?
void webService_GetAddressCompleted(object sender, BusinessApp.ContactServiceReference.GetAddressCompletedEventArgs e)
{
//this.addGrid.ItemsSource = e.Result;
}
?
Lambda表達重構如下
ServiceClient webService = new ContactServiceClient("binaryBinding");
webService.GetContactByLastNameCompleted += (s,e)=>{
//this.addGrid.ItemsSource = e.Result;
};
webService.GetContactByLastNameAsync(this.lastNameTextBox.Text);
?
從上面看代碼非常的簡潔
?
下面用更加專業的手法再重構一下
?
這次重構的目的是為了讓這段代碼更好被其他人使用我們把他封裝一下
public void GetServiceData(Action<IEnumerable<Contact>,Exception> callback,string inputtext)
{
var webService = new ContactServiceClient("binaryBinding");
webService.GetContactByLastNameCompleted += (s, e) =>
{
var usercallback = e.UserState as Action<IEnumerable<Contact>, Exception>;
if (usercallback == null)
return;
if (e.Error != null)
{
usercallback(null, e.Error);
return;
}
usercallback(e.Result, null);
?
};
webService.GetContactByLastNameAsync(inputtext,callback);
?
}
?
調用上面的方法
GetServiceData((contactList, error) =>
{
if (error != null)
MessageBox.Show(error.Message);
else
this.addGrid.ItemsSource = contactList;
}
);
?
?
RIA DomainContext Lambda寫法
?
#region query callback
/*
var db2=new DbDomainContext() db2.Load(db2.GetByPKQuery(this.TradeCode,this.CopEmsNo,this.CopImgNo),
loadOperation =>
{
loadOperation.Completed += (s, e) =>
{
var e1= loadOperation.Entities;
if (e1.Count() > 0)
{
Console.WriteLine(e1.First());
}
};
}, null);
*/
#endregion
?
?
#region query.completed
var query = db2.Load(db2.GetByPKQuery(this.TradeCode, this.CopEmsNo, this.CopImgNo));
query.Completed +=(s,e)=>
{
PRE_EMS3_ORG_EXG item = null;
LoadOperation<PRE_EMS3_ORG_EXG> q = (LoadOperation<PRE_EMS3_ORG_EXG>)s;
if (q.Entities.Count() > 0)
{
?
item = q.Entities.First();
}
?
};
#endregion
?
?
沒有理由拒絕Lambda表達式
?
既可以提高可讀性,又能夠減少代碼數量,我實在找不出任何理由拒絕Lambda表達式
?
轉載于:https://www.cnblogs.com/neozhu/archive/2010/07/16/1778864.html
總結
以上是生活随笔為你收集整理的代码重构之没有理由拒绝Lambda表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈DNS体系结构:DNS系列之一
- 下一篇: 虚拟化部署之Hyper-V虚拟网络配置