国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

CSharp的lambda表達(dá)式匿名類擴(kuò)展方法

這篇具有很好參考價(jià)值的文章主要介紹了CSharp的lambda表達(dá)式匿名類擴(kuò)展方法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

c#的lamba表達(dá)式

之前已經(jīng)寫過一些關(guān)于委托還有事件的文章,今天就來介紹一下lambda表達(dá)式。
首先定義需要的函數(shù)以及委托

{
public delegate void DoNothingDelegate();
public delegate void StudyDelegate(int id, string name);

private void DoNothing()
{
    Console.WriteLine("DoNothing");
}

private void Study(int id , string name)
{
    Console.WriteLine($"{id} {name} 學(xué)習(xí) .Net高級(jí)班 " );
}
}

在.net farmwork 1.0,會(huì)這樣寫我們的匿名函數(shù)


   public void Show()
   {
       {
           //.netframework 1.0的寫法
           DoNothingDelegate doNothing = new DoNothingDelegate(DoNothing);
           StudyDelegate study = new StudyDelegate(Study);
       }
   }

在.netframework 2.0,會(huì)這樣寫匿名函數(shù), 增加了一個(gè)delegate關(guān)鍵字

 {
     DoNothingDelegate doNothing = new DoNothingDelegate (delegate ()
     {
         Console.WriteLine("DoNothing");
     });
     StudyDelegate study = new StudyDelegate( delegate (int id, string name)
     {
         Console.WriteLine($"{id} {name} 學(xué)習(xí) .Net高級(jí)班 ");
     });
 }

在.netframework3.0,去掉了delegate關(guān)鍵字了,在參數(shù)后增加了一個(gè)=> goes to

{
    DoNothingDelegate doNothing = new DoNothingDelegate(() =>
    {
        Console.WriteLine("DoNothing");
    });
    StudyDelegate study = new StudyDelegate((int id, string name) =>
    {
        Console.WriteLine($"{id} {name} 學(xué)習(xí) .Net高級(jí)班 ");
    });
}

在.netframework3.0后期,我們可以省略參數(shù)的信息

 StudyDelegate study = new StudyDelegate((id, name) =>
 {
     Console.WriteLine($"{id} {name} 學(xué)習(xí) .Net高級(jí)班 ");
 });

如果匿名方法體中只有一行代碼,可以省略方法題的大括號(hào)

StudyDelegate study = new StudyDelegate((id, name) =>Console.WriteLine($"{id} {name} 學(xué)習(xí) .Net高級(jí)班 "));

只有一個(gè)參數(shù)的時(shí)候,參數(shù)的小括號(hào)也可以省略掉。

public delegate void StudyNew(int id);
StudyNew study = id => Console.WriteLine($"{id} 學(xué)習(xí) .Net高級(jí)班 ");

如果方法返回值?
如果lambda表達(dá)式中只有一行代碼,且有返回值,可以省略return,

Func<int> retNum= () => 1;

lamba函數(shù)的本質(zhì)是什么?

這里使用ilspy進(jìn)行反編譯來看一下匿名方法的實(shí)現(xiàn)是怎么樣的

CSharp的lambda表達(dá)式匿名類擴(kuò)展方法

本質(zhì)上來說,其實(shí)就是一個(gè)方法--匿名方法, 在類里面會(huì)生成和lambad 表達(dá)式參數(shù)和返回值完全匹配的方法.

匿名類

有時(shí)候,可以需要?jiǎng)?chuàng)建一個(gè)臨時(shí)的類對(duì)象,保存數(shù)據(jù),方便使用。
一個(gè)普通的類對(duì)象


  public class Student
  {
      public int Id { get; set; }
      public int ClassId { get; set; }

      public string Name { get; set; }

      public int Age { get; set; }

      public string Description { get; set; }

      public void Study()
      {
          Console.WriteLine($"{this.Id} {this.Name} 跟著老師學(xué)習(xí) .Net開發(fā)");

      }

      public void StudyQt()
      {
          Console.WriteLine($"{this.Id} {this.Name} 跟著老師學(xué)習(xí)C++ Qt");
      }
  }

當(dāng)創(chuàng)建一個(gè)普通的類對(duì)象的時(shí)候,這樣去創(chuàng)建一個(gè)類對(duì)象。

 Student student = new Student()
 {
     Id = 1,
     ClassId = 2,
     Name = "張三",
     Age = 20,
     Description = "這是一個(gè)學(xué)生"
 };

現(xiàn)在嘗試最原始的方法去創(chuàng)建一個(gè)匿名類,

object model = new
{
    Id = 1,
    Name = "小樓一夜聽春雨",
    Age = 14,
    Description = "魔刀丁鵬"
};

為什么可以定義一個(gè)匿名的對(duì)象?

因?yàn)镃#中所有的對(duì)象都繼承自O(shè)bject對(duì)象.

當(dāng)嘗試使用.去訪問其中的屬性就會(huì)報(bào)錯(cuò).

C#是強(qiáng)類型語言(編譯時(shí)決定類型),object是在編譯時(shí)確定類型,因?yàn)镺bject沒有Id等屬性,所以無法通過.去訪問其中的變量.

因此可以使用下面的方法去訪問我們的匿名對(duì)象中的屬性.

 dynamic model1 = new
 {
     Id = 2,
     Name = "天下第一的劍客",
     Age = 18,
     Description = "神劍山莊謝曉峰"
 };

 Console.WriteLine(model1.Id);
 Console.WriteLine(model1.Age);
 Console.WriteLine(model1.Amy); //報(bào)錯(cuò)

這里使用了dynamic關(guān)鍵字去避開了編譯器的檢查,會(huì)在運(yùn)行時(shí)檢查,運(yùn)行時(shí)決定類型.這個(gè)出現(xiàn)亂取的問題,導(dǎo)致程序崩潰.

有什么方法可以正確的取出想訪問的屬性,又可以避免訪問不存在的屬性那?
var關(guān)鍵字

  var model2 = new
  {
      Id = 3,
      Name = "天下第二的劍客",
      Age = 16,
      Description = "不會(huì)劍法的阿飛"
  };

  Console.WriteLine(model2.Id);
  Console.WriteLine(model2.Name);
  //Console.WriteLine(model2.Aniu); //報(bào)錯(cuò)!無法訪問不存在的變量

var類型就是弱類型的變量.

使用的注意事項(xiàng)?

  1. 不能在匿名類里面聲明方法,同時(shí)在聲明匿名類的屬性時(shí)候,就給定匿名類的屬性初始值.
  2. 不能給屬性重新賦值.
  3. var聲明的變量必須初始化,必須能推算出類型,也不允許作為方法的參數(shù)類型.

使用的建議?

  1. var配合匿名類型使用
  2. var偷懶,配合復(fù)雜類型時(shí)使用。
  3. 在不知道具體什么類型的時(shí)候就可以使用var來聲明

缺陷

在代碼閱讀的時(shí)候,不是很方便。

建議在大家寫代碼的時(shí)候,盡量明確類型。

擴(kuò)展方法

為什么需要擴(kuò)展方法?

  1. 擴(kuò)展:讓功能變得更加強(qiáng)大,讓不存在功能存在. ---新增邏輯處理
  2. 已經(jīng)存在方法,正常調(diào)用,擴(kuò)展的東西不影響已經(jīng)存在的方法
  3. 如果需求變更,需要支持另外的一個(gè)新的功能。

接著上面學(xué)生的用例,我們可以追加一些需求.

Student student1 = new Student()
{
    Id = 1,
    ClassId = 2,
    Name = "張三",
    Age = 20,
    Description = "這是一個(gè)學(xué)生"
};

student1.Study();
student1.StudyQt();

如果要增加一個(gè)需求--學(xué)習(xí)嵌入式---直接增加方法.
傳統(tǒng)的方式對(duì)原有的類進(jìn)行結(jié)構(gòu)上的修改.

期望:既可以增加新的功能,歷史代碼不變.直接增加類,在新的類中去完成.

這里就可以使用擴(kuò)展方法來完成需求.

 public static class MethodExtension
 {
     public static void StudyEmbedded(this Student student)
     {
         Console.WriteLine($"{student.Id} {student.Name} 跟著老師學(xué)習(xí)嵌入式開發(fā)");
     }
 }

program.cs

student.StudyEmbedded();

可以看到做的操作就是:

  1. 把類變成靜態(tài)類
  2. 把方法的第一個(gè)參數(shù)+this修飾

這樣就完成了一個(gè)擴(kuò)展方法.靜態(tài)方法的調(diào)用--可以像實(shí)例方法一樣去調(diào)用.

不用修改原有的任何類中的類,可以新增功能;

有哪些場景?

  1. 有新的需求來的時(shí)候--擴(kuò)展方法--保證歷史代碼功能
  2. 要應(yīng)用第三方的DLL庫(提供的功能不完善,我們自己需要升級(jí)下----dll,不能修改原有的代碼)擴(kuò)展方法
  3. 封裝幫助類庫
  4. asp.net core 中,到處都是擴(kuò)展方法--框架的設(shè)計(jì)--最小化設(shè)計(jì).提供一個(gè)最基本、最最最簡單的功能,提供給調(diào)用方.這種方式在使用的時(shí)候,如果想要增強(qiáng)功能,就可以擴(kuò)展. 好處:
    1. 盡可能簡化代碼
    2. 靈活分配,需要就擴(kuò)展什么.按需擴(kuò)展,不會(huì)有代碼冗余.

這里有個(gè)問題,我可以給任意類型寫擴(kuò)展方法嘛? 注意:擴(kuò)展object類型.

 public static string SubObj(this object str, int len = 10)
 {
     if (str is null)
     {
         return string.Empty;
     }

     if (str.ToString().Length <= 10)
     {
         return str.ToString();
     }
     else
     {
         str = $"{str.ToString().Substring(0, len)}....";
         return str.ToString();
     }

 }

program.cs

 object o = "object 類型";
 o.SubObj();
  
 int i = 1;
 i.SubObj();//可以

 string sr = "你好";
 sr.SubObj();


 str.SubGeneric();
 student.SubGeneric(); //隱患

總結(jié):文章來源地址http://www.zghlxwxcb.cn/news/detail-839853.html

  1. 擴(kuò)展的類型具有繼承性,擴(kuò)展父類,所有子類都擁有這個(gè)功能;擴(kuò)展的功能可能不適用一些具體的類型;但是仍然可以調(diào)用;可以造成一些類型的功能的污染;----慎用
  2. 不建議擴(kuò)展object,也不是很建議大家去泛型擴(kuò)展.

到了這里,關(guān)于CSharp的lambda表達(dá)式匿名類擴(kuò)展方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C++】STL 算法 ② ( foreach 循環(huán)中傳入 函數(shù)對(duì)象 / Lambda 表達(dá)式處理元素 | foreach 循環(huán)算法 | Lambda 表達(dá)式 - 匿名 函數(shù)對(duì)象 / 仿函數(shù) )

    【C++】STL 算法 ② ( foreach 循環(huán)中傳入 函數(shù)對(duì)象 / Lambda 表達(dá)式處理元素 | foreach 循環(huán)算法 | Lambda 表達(dá)式 - 匿名 函數(shù)對(duì)象 / 仿函數(shù) )

    在 C++ 語言中 , std::foreach 循環(huán) 雖然 不是標(biāo)準(zhǔn)庫的一部分 , 但是 C ++ 編譯器 提供了對(duì) 該語法 的支持作為擴(kuò)展 ; 使用 該 std::foreach 循環(huán) , 可以用于 遍歷 STL 標(biāo)準(zhǔn)模板庫 中提供的容器 , 如 vector 單端數(shù)組 , list 雙向鏈表 , map 映射 , set 集合 等 容器 中的元素 ; std::for_each 是一個(gè)算

    2024年02月02日
    瀏覽(45)
  • 【C#進(jìn)階】C#中的委托、事件、回調(diào)函數(shù)、匿名函數(shù)和lambda表達(dá)式

    委托是一種類型,它可以存儲(chǔ)對(duì)一個(gè)或多個(gè)方法的引用。它類似于C/C++中的函數(shù)指針,允許您將方法作為參數(shù)傳遞、存儲(chǔ)和調(diào)用。 寫法: delegate return_type delegate_name( ); return_type :表示委托所引用方法的返回類型。 delegate_name :表示委托的名稱。 parameters :表示委托所引用方法

    2024年02月06日
    瀏覽(21)
  • Csharp中表達(dá)式樹

    Csharp中表達(dá)式樹

    這節(jié)課來了解一下表示式樹是什么? 在C#中,表達(dá)式樹是一種數(shù)據(jù)結(jié)構(gòu),它可以表示一些代碼塊,如Lambda表達(dá)式或查詢表達(dá)式。表達(dá)式樹使你能夠查看和操作數(shù)據(jù),就像你可以查看和操作代碼一樣。它們通常用于創(chuàng)建動(dòng)態(tài)查詢和解析表達(dá)式。 為什么要這樣說?它和委托有什么

    2024年03月27日
    瀏覽(12)
  • Lambda表達(dá)式與“::“方法引用 & 判空包裝類Optional

    函數(shù)式接口(Functional Interface)就是有且僅有一個(gè)抽象方法,但是可以有多個(gè)非抽象方法的接口。 函數(shù)式接口可以被隱式轉(zhuǎn)換為Lambda表達(dá)式。 方法引用主要是對(duì)Lambda表達(dá)式的一種優(yōu)化! 方法引用的使用前提是對(duì)象和方法都是已經(jīng)存在的! 方法引用提供了一種引用而不執(zhí)行方

    2024年02月06日
    瀏覽(47)
  • (十一)CSharp-LINQ-查詢表達(dá)式(2)

    (十一)CSharp-LINQ-查詢表達(dá)式(2)

    1、查詢表達(dá)式的結(jié)構(gòu) 查詢表達(dá)式由 from 子句和查詢主體組成。 子句必須按照一定的順序出現(xiàn)。 from 子句和 select…group 子句這兩部分是必需的。 其他子句是可選的。 在 LINQ 查詢表達(dá)式中,select 子句在表達(dá)式最后。 可以有任意多的 from…let…where 子句。 2、from 子句 from 子句

    2024年02月11日
    瀏覽(22)
  • 【javaSE】 Lambda表達(dá)式與Lambda表達(dá)式的使用

    【javaSE】 Lambda表達(dá)式與Lambda表達(dá)式的使用

    Lambda表達(dá)式是Java SE 8中一個(gè)重要的新特性。lambda表達(dá)式允許你通過表達(dá)式來代替功能接口。 lambda表達(dá)式就和方法一樣,它提供了一個(gè)正常的參數(shù)列表和一個(gè)使用這些參數(shù)的主體(body,可以是一個(gè)表達(dá)式或一個(gè)代碼塊)。 Lambda 表達(dá)式(Lambda expression) ,基于數(shù)學(xué)中的λ演算得名,也

    2024年02月08日
    瀏覽(27)
  • JAVA8-lambda表達(dá)式8:在設(shè)計(jì)模式-模板方法中的應(yīng)用

    JAVA8-lambda表達(dá)式1:什么是lambda表達(dá)式 JAVA8-lambda表達(dá)式2:常用的集合類api JAVA8-lambda表達(dá)式3:并行流,提升效率的利器? JAVA8-lambda表達(dá)式4:Optional用法 java8-lambda表達(dá)式5:toMap引發(fā)的線上故障 JAVA8-lambda表達(dá)式6:重構(gòu)和定制收集器 JAVA8-lambda表達(dá)式7:重要的函數(shù)接口 最近在公司

    2024年02月14日
    瀏覽(29)
  • Java 8及以上新特性:Lambda表達(dá)式、Stream API、Optional類與接口默認(rèn)方法(四)

    目錄 一、接口默認(rèn)方法 1.1 概念解析: 1.2 應(yīng)用場景: 1.3 使用注意事項(xiàng): 1.4 使用示例: 二、結(jié)論 1.1 總結(jié)Java 8及以上版本四大新特性的重要意義與價(jià)值: 1.2 鼓勵(lì)讀者積極學(xué)習(xí)并運(yùn)用這些新特性: 1.3 對(duì)未來Java版本可能引入的新特性進(jìn)行展望: 1.1 概念解析: 接口默認(rèn)方法

    2024年04月13日
    瀏覽(30)
  • Python tkinter bind三種方法傳參,不用lambda表達(dá)式也可以(任何人都會(huì))

    很多人都有過這樣的疑惑:如何在tkinter 里面?zhèn)鲄??比如?chuàng)建了一個(gè)列表,需要對(duì)列表中的每一項(xiàng)綁定方法;比如有多個(gè)相似的按鈕想要一次性完成,這個(gè)時(shí)候不得不傳遞參數(shù)。 但是Python 語言又非常討厭的沒有給傳遞參數(shù)的空間,bind 方法只能傳函數(shù),而不能傳參數(shù)是真的討

    2024年02月09日
    瀏覽(22)
  • 進(jìn)階JAVA篇- Lambda 表達(dá)式與 Lambda 表達(dá)式的省略規(guī)則

    進(jìn)階JAVA篇- Lambda 表達(dá)式與 Lambda 表達(dá)式的省略規(guī)則

    目錄 ? ? ? ? 1.0 什么是 Lambda 表達(dá)式? ? ? ? ? 1.1 既然跟匿名內(nèi)部類相關(guān),先來回顧匿名內(nèi)部類。 ? ? ? ? ?1.2 Lambda 表達(dá)式與匿名內(nèi)部類之間的關(guān)系。 ? ? ? ? 1.3 函數(shù)式接口 ? ? ? ? 1.4 在具體代碼中來操作一下 ? ? ? ? 2.0?Lambda 表達(dá)式省略規(guī)則 ??????? ?Lambda 表達(dá)

    2024年02月08日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包