C#中的匿名類型

????這節來講一下C#中的匿名類型。

匿名類

????在C#中,我們可以不去顯示的聲明一個類,而是通過匿名類去臨時聲明一個類結構去幫助我們去完成一些功能。

????聲明一個匿名類,我們可以像下面這樣做:

var Anonymous=new {name="charles",year=18};//聲明匿名類對象

????需要注意的是,匿名類成員只能聲明公共的只讀屬性,不能在匿名類中聲明方法,因此匿名類的作用主要是承載類的數據,而非類的行為,也就是方法。由匿名類型實例化的對象則被成為匿名對象,匿名對象使用var關鍵字標識。比如說解析一條JSON數據,我們完全可以通過匿名類的形式去獲取我們想得到的數據,請看如下代碼:

string json = " { \"name\":\"charles\" , \"year\":18 ,\"address\":"shandong"}";
var jsonObj = JsonConvert.DeserializeAnonymousType(json, new{name = string.Empty,year = 0});
Console.WriteLine($"name is {jsonObj.name},year is {jsonObj.year}");

????這段代碼使用了Newtonsoft.Json中的一個JSON轉換方法,該方法可以將一條JSON轉換為我們指定的匿名對象。如果沒有匿名對象,我們需要創建一個類,去為了轉換這一JSON,但是使用匿名類就簡單許多,而且實際上我們只需要關注我們需要的屬性即可,至于JSON中的其它對象,我們可以一概丟棄。? ?

????初此以外,我們在使用Linq方法Select()的使用,也可以用匿名類型:

//class AnonymousTemp
//{
//    public int Id { get; set; }
//    public string Name { get; set; }
//    public int Year { get; set; }
//}
List<AnonymousTemp>= new List<AnonymousTemp>();
list.Add(new AnonymousTemp() { Id = 1, Name = "Charles", Year = 18 });
list.Add(new AnonymousTemp() { Id = 2, Name = "Chiron", Year = 18 });
var aList = list.Select(u => new{id = u.Id,name = u.Name});foreach (var item in aList)
{Console.WriteLine($"name is {item.id},year is {item.name}");
}

?????比如我們查到一組集合,我們只關心其中的幾個屬性(當然如果只需要取一個屬性,則不需要匿名類,直接返回該屬性值就可以了),就可以使用匿名類型。上述代碼中 Select方法的參數,接受一個委托,也就引出了匿名方法,但是這個地方我用的并不是匿名方法,而是Lambda表達式,我們接著講。

匿名方法(僅作了解)

????Select方法需要一個委托類型的參數,我們可以直接向里傳入一個方法,傳統的操作需要我們自己聲明一個符合要求的委托,并且為這個委托傳入方法,將這個委托作為參數傳入Select方法中,但是后來為了簡化操作,在C#2.0推出了匿名委托,匿名委托的結構為:

delegate (參數){//方法體}

這樣上述Select方法用匿名方法的形式可以改寫為如下形式:

var aList = list.Select(delegate (AnonymousTemp u)
{return new{id = u.Id,name = u.Name};
});

????這樣看似是簡單了許多,但是為了更加簡單,在C#3.0微軟推出了Lambda表達式,是對于匿名方法的進一步簡化,從對比中我們也可以看出,Lambda表達式寫起來要更爽一些。因此大家對于匿名方法可以僅做了解,而應該著重了解Lambda表達式的使用。

真的匿名?

????匿名方法真的匿名嗎?為此,我們可以反編譯一下這個項目,就能看到,無論是匿名類還是匿名方法,編譯器在編譯時都會為我們創建一個類,雖然我們寫的少的,但編譯器并沒有少做:

????下圖是編譯器解析匿名類,為我們生成的真正的類代碼:


7bcc7c8f412995f132f73be48f57c01f.png


????下圖是編譯器解析匿名方法和Lambda表達式,為我們生成的一個類,這個類里邊是兩個方法,分別對應我寫的匿名方法和Lambda表達式,我們可以看出它們最終都被編譯為一個委托:


258964027da887d97cda2f7748bf2c22.png


????但盡管如此,匿名類或者匿名方法也只能在其所在的上下文中使用,并不能跨作用域訪問。

109534dfe3dedf083f49cfedf0bb37d4.jpeg

本節到此結束...

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/283750.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/283750.shtml
英文地址,請注明出處:http://en.pswp.cn/news/283750.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL之MHA高可用集群

目錄 一、MHA概述 1.1.MHA 是什么 1.2.MHA 的組成 1.3.MHA 的特點 二、MHA搭建準備 2.1.實驗思路 三、MHA搭建 3.1配置主從復制 3.2.安裝 MHA 軟件 3.3.故障模擬 3.4.故障修復 四、總結 一、MHA概述 1.1.MHA 是什么 1.MHA&#xff08;MasterHigh Availability&…

Tensorflow之安裝

1.fellow the instruction of https://www.tensorflow.org/install/install_linux#installing_with_anaconda 2.anaconda安裝&#xff0c;修改~/.bash_profile為 export PATH~/anaconda2/bin:/usr/local/cuda/bin:$PATHexport LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRAR…

2、Saltstack的數據系統

一、Grainsgrains是salt用來收集minion端底層系統信息的接口。比如&#xff0c;操作系統type、域名 、IP地址、內存及其他相關系統屬性信息等。存儲在minion端&#xff0c;用于保存minion端數據信息。minion啟動時才加載grains信息&#xff0c;所以他時靜態的&#xff0c;Grain…

配置中心 App Configuration (一):輕松集成到Asp.Net Core

寫在前面在日常開發中&#xff0c;我這邊比較熟悉的配置中心有&#xff0c;攜程Apollo&#xff0c;阿里Nacos(配置中心&#xff0c;服務治理一體)之前文章&#xff1a;Asp.Net Core與攜程阿波羅(Apollo)的第一次親密接觸總體來說&#xff0c;Apollo和Nacos社區都比較活躍&#…

stop-hbase.sh一直處于等待狀態

今天關閉HBase時&#xff0c;輸入stop-hbase.sh一直處于等待狀態 解決方法&#xff1a; 先輸入&#xff1a;hbase-daemon.sh stop master 再輸入&#xff1a;stop-hbase.sh就可以關閉HBase集群了。 轉載于:https://www.cnblogs.com/lijinze-tsinghua/p/8667761.html

shell編程100例

1、編寫hello world腳本 #!/bin/bash# 編寫hello world腳本echo "Hello World!"2、通過位置變量創建 Linux 系統賬戶及密碼 #!/bin/bash# 通過位置變量創建 Linux 系統賬戶及密碼#$1 是執行腳本的第一個參數,$2 是執行腳本的第二個參數 useradd "$1" …

sqlserver 分頁

select top 10 numComImg.* from( select row_number() over(order by id asc) as rownumber,* from (select * FROM [TCCLine].[dbo].[CLine_CommonImage]) as comImg)as numComImg where rownumber>40select top 10 * --10 為頁大小from [TCCLine].[dbo].[CLine_CommonIma…

詳解SpringMVC中Controller的方法中參數的工作原理[附帶源碼分析] good

目錄 前言現象源碼分析 HandlerMethodArgumentResolver與HandlerMethodReturnValueHandler接口介紹HandlerMethodArgumentResolver與HandlerMethodReturnValueHandler接口的具體應用常用HandlerMethodArgumentResolver介紹常用HandlerMethodReturnValueHandler介紹本文開頭現象…

instancing render

當要繪制同一個東西很多次的時候&#xff0c;最簡單的想法可能是循環調用glDrawArrays()&#xff0c;但這樣會造成性能的損失。因為當顯卡在渲染一個物體的時候&#xff0c;可能并不需要太多時間&#xff0c;但系統會花大量的時間&#xff0c;頻繁的調用draw命令&#xff0c;再…

對不起,我不是一個自律的人

大家好&#xff0c;我是 &#x1f41f;&#x1f4a8;。前天&#xff0c;星球 的一位大學生朋友問了我幾個問題&#xff1a;你大學時如何安排每日的時間&#xff1f;為什么能學那么多技術&#xff1f;你會學習到很晚嗎&#xff1f;你是如何保持自律的&#xff1f;我覺得這幾個問…

保證接口數據安全的10種方案

前言 大家好&#xff0c;我是程序汪&#xff0c;互聯網項目需要特別注意數據安全&#xff0c;如果你簡歷上是互聯網類型項目&#xff0c;安全方面肯定要能說出個一二三&#xff0c;下面分享下這方面的干貨&#xff0c;大家可以記住幾條&#xff0c;面試時好說道說道 我們日常…

Html5本地存儲LocalStorage

HTML5 提供了兩種在客戶端存儲數據的新方法&#xff1a; localStorage - 沒有時間限制的數據存儲sessionStorage - 針對一個 session 的數據存儲在瀏覽器中打開審查元素&#xff08;如谷歌F12&#xff09;&#xff0c;在Resources下面可以查看里面的數據。 localStorage提供了幾…

python 中的os模塊

python os模塊 Python os 模塊提供了一個統一的操作系統接口函數一、對于系統的操作1、os.name 當前使用平臺其中 ‘nt’ 是 windows&#xff0c;’posix’ 是linux 或者 unix2、os.sep輸出操作系統的特定的路徑分隔符。Win下為“\”&#xff0c;Linux下為“/”3、os.pathsep 輸…

java第一季2.2

2019獨角獸企業重金招聘Python工程師標準>>> 標識符&#xff1a; 是給變量類方法命名的符號、標識符開頭可以_、字母、$命名&#xff0c;不可以用數字命名。關鍵字不可命名&#xff0c;大小寫區分。不可以用非法字符 變量&#xff1a;變量類型。變量名。變量值。如&…

讀《華為數字化轉型之道》

數字化轉型應該很多人都聽過&#xff0c;但如果你做過 ToB 軟件&#xff0c;聽得更多的是信息化&#xff0c;那信息化和數字化是什么關系呢&#xff1f;下面用一個小例子來說說我的理解。記得剛上初中的時候&#xff0c;平時測驗、考試的試卷&#xff0c;都是人工在板上進行刻寫…

Thrift基本原理及使用

參考文章RPC 基本原理與 Apach Thrift 初體驗 RPC基本原理 RPC(Remote Procedure Call)&#xff0c;遠程過程調用&#xff0c;大部分的RPC框架都遵循如下三個開發步驟&#xff1a; 1. 定義一個接口說明文件&#xff1a;描述了對象(結構體)、對象成員、接口方法等一系列信息&am…

01-H5語義化標簽

轉載于:https://www.cnblogs.com/Zeki/p/5901399.html

JSON 解析的兩種方法

今天幫朋友看了下JSON解析結果 eval解析JSON中的注意點在JS中將JSON的字符串解析成JSON數據格式&#xff0c;一般有兩種方式&#xff1a; 1.一種為使用eval()函數。 2. 使用Function對象來進行返回解析。 使用eval函數來解析&#xff0c;并且使用jquery的each方法來遍歷 用jque…

配置中心 App Configuration (三):配置的動態更新

Get Azure key-value pairs from App configuration | Serverless360寫在前面我在前文&#xff1a;《微軟Azure配置中心 App Configuration (一)&#xff1a;輕松集成到Asp.Net Core》已經介紹了Asp.net Core怎么輕易的接入azure 配置中心App Configuration(下稱azure 配置中心…

萬字總結 JS 數據結構與常用的算法

前言 首先&#xff0c;為什么我會學習數據結構與算法呢&#xff0c;其實主要是有兩方面 第一&#xff0c;是我在今年的flag里明確說到我會學這個東西第二&#xff0c;學了這些&#xff0c;對自己以后在工作或者面試也會帶來許多好處然后&#xff0c;本文是最近學習的一個總結文…