c# 扩展方法奇思妙用高级篇一:改进 Scottgu 的 In 扩展
生活随笔
收集整理的這篇文章主要介紹了
c# 扩展方法奇思妙用高级篇一:改进 Scottgu 的 In 扩展
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
先看下ScottGu對In的擴(kuò)展:
調(diào)用示例1:
調(diào)用示例2:
原文地址:New "Orcas" Language Feature: Extension Methods
很多介紹擴(kuò)展方法的也大都使用"In"作為例子,但很少有人再深入想一步。個(gè)人感覺這個(gè)In擴(kuò)展的不夠徹底,試看如下代碼:
????????public?static?void?Example1()
????????{
????????????bool?b1?=?1.In(new?int[]?{?1,?2,?3,?4,?5?});
????????????bool?b2?=?"Tom".In(new?string[]?{?"Bob",?"Kitty",?"Tom"?});
????????}
????????//ScottGu?In擴(kuò)展
????????public?static?bool?In(this?object?o,?IEnumerable?c)
????????{
????????????foreach?(object?i?in?c)
????????????{
????????????????if?(i.Equals(o))?return?true;
????????????}
????????????return?false;
????????}
每次使用 In 時(shí)都要聲明一個(gè)數(shù)組(或集合),有點(diǎn)麻煩,如果像下面這個(gè)樣子調(diào)用應(yīng)該比較簡單一些:
????????public?static?void?Example2()
????????{
????????????bool?b1?=?1.In(1,?2,?3,?4,?5);
????????????bool?b2?=?1.In(1,?2,?3,?4,?5,?5,?7,?8);
????????????bool?b3?=?"Tom".In("Bob",?"Kitty",?"Tom");
????????????bool?b4?=?"Tom".In("Bob",?"Kitty",?"Tom",?"Jim");
????????}感覺如何,是否有點(diǎn)類似SQL中的In?
如何擴(kuò)展的呢,很簡單,這里使用了 params 這個(gè)“方法參數(shù)關(guān)鍵字”(MSDN中名字),還是看代碼吧!
通過 params 我們不必再顯式聲明數(shù)組了,省了不少“筆墨”。
????????//ScottGu?In擴(kuò)展?改進(jìn)
????????public?static?bool?In(this?object?o,?params?object[]?c)
????????{
????????????foreach?(object?i?in?c)
????????????????if?(i.Equals(o))?return?true;
????????????return?false;
????????}
上面一直是對 object 進(jìn)行擴(kuò)展,但存在一個(gè)很大的隱患,你的代碼可能會(huì)不注意寫成以下的樣子
????????public?static?void?Example3()
????????{
????????????string?name?=?"Application1";
????????????string?name1?=?"Bob";
????????????string?name2?=?"Kitty";
????????????string?name3?=?"Tom";
????????????string?s?=?"Tom";
????????????bool?b1?=?s.In(name1,?name2,?name3);
????????????bool?b2?=?s.In(name1,?name2,?name,?3);//不注意加了個(gè)小逗號
????????}
編譯,照樣運(yùn)行,出了錯(cuò)很難查找原因。幸好我們c#有泛型,最后改進(jìn)一次:
????????//ScottGu?In擴(kuò)展?改進(jìn)
????????public?static?bool?In<T>(this?T?t,?params?T[]?c)
????????{
????????????return?c.Any(i?=>?i.Equals(t));
????????}再編譯,通不過了,報(bào)錯(cuò)如下:
問題解決了。
技術(shù)總結(jié):我們使用 params 和 泛型改進(jìn)了 ScottGu?的?In 擴(kuò)展,使用調(diào)用代碼更加簡潔,同時(shí)也能減少編程中的誤輸入。
思想總結(jié):網(wǎng)上好多文章都是轉(zhuǎn)來轉(zhuǎn)去,沒有自己的想法,其它只要深入想一步,會(huì)有很多新發(fā)現(xiàn)。
《c#擴(kuò)展方法奇思妙用》是個(gè)專題,包含很多方面的應(yīng)用,請保持關(guān)注!謝謝!
調(diào)用示例1:
調(diào)用示例2:
原文地址:New "Orcas" Language Feature: Extension Methods
很多介紹擴(kuò)展方法的也大都使用"In"作為例子,但很少有人再深入想一步。個(gè)人感覺這個(gè)In擴(kuò)展的不夠徹底,試看如下代碼:
????????public?static?void?Example1()
????????{
????????????bool?b1?=?1.In(new?int[]?{?1,?2,?3,?4,?5?});
????????????bool?b2?=?"Tom".In(new?string[]?{?"Bob",?"Kitty",?"Tom"?});
????????}
????????//ScottGu?In擴(kuò)展
????????public?static?bool?In(this?object?o,?IEnumerable?c)
????????{
????????????foreach?(object?i?in?c)
????????????{
????????????????if?(i.Equals(o))?return?true;
????????????}
????????????return?false;
????????}
每次使用 In 時(shí)都要聲明一個(gè)數(shù)組(或集合),有點(diǎn)麻煩,如果像下面這個(gè)樣子調(diào)用應(yīng)該比較簡單一些:
????????public?static?void?Example2()
????????{
????????????bool?b1?=?1.In(1,?2,?3,?4,?5);
????????????bool?b2?=?1.In(1,?2,?3,?4,?5,?5,?7,?8);
????????????bool?b3?=?"Tom".In("Bob",?"Kitty",?"Tom");
????????????bool?b4?=?"Tom".In("Bob",?"Kitty",?"Tom",?"Jim");
????????}感覺如何,是否有點(diǎn)類似SQL中的In?
如何擴(kuò)展的呢,很簡單,這里使用了 params 這個(gè)“方法參數(shù)關(guān)鍵字”(MSDN中名字),還是看代碼吧!
通過 params 我們不必再顯式聲明數(shù)組了,省了不少“筆墨”。
????????//ScottGu?In擴(kuò)展?改進(jìn)
????????public?static?bool?In(this?object?o,?params?object[]?c)
????????{
????????????foreach?(object?i?in?c)
????????????????if?(i.Equals(o))?return?true;
????????????return?false;
????????}
上面一直是對 object 進(jìn)行擴(kuò)展,但存在一個(gè)很大的隱患,你的代碼可能會(huì)不注意寫成以下的樣子
????????public?static?void?Example3()
????????{
????????????string?name?=?"Application1";
????????????string?name1?=?"Bob";
????????????string?name2?=?"Kitty";
????????????string?name3?=?"Tom";
????????????string?s?=?"Tom";
????????????bool?b1?=?s.In(name1,?name2,?name3);
????????????bool?b2?=?s.In(name1,?name2,?name,?3);//不注意加了個(gè)小逗號
????????}
編譯,照樣運(yùn)行,出了錯(cuò)很難查找原因。幸好我們c#有泛型,最后改進(jìn)一次:
????????//ScottGu?In擴(kuò)展?改進(jìn)
????????public?static?bool?In<T>(this?T?t,?params?T[]?c)
????????{
????????????return?c.Any(i?=>?i.Equals(t));
????????}再編譯,通不過了,報(bào)錯(cuò)如下:
問題解決了。
技術(shù)總結(jié):我們使用 params 和 泛型改進(jìn)了 ScottGu?的?In 擴(kuò)展,使用調(diào)用代碼更加簡潔,同時(shí)也能減少編程中的誤輸入。
思想總結(jié):網(wǎng)上好多文章都是轉(zhuǎn)來轉(zhuǎn)去,沒有自己的想法,其它只要深入想一步,會(huì)有很多新發(fā)現(xiàn)。
《c#擴(kuò)展方法奇思妙用》是個(gè)專題,包含很多方面的應(yīng)用,請保持關(guān)注!謝謝!
總結(jié)
以上是生活随笔為你收集整理的c# 扩展方法奇思妙用高级篇一:改进 Scottgu 的 In 扩展的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络知识体系
- 下一篇: jQuery学习笔记:Ajax(二)