欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

C#中字段、屬性、只讀、構(gòu)造函數(shù)賦值、反射賦值的示例分析

這篇文章給大家分享的是有關(guān)C#中字段、屬性、只讀、構(gòu)造函數(shù)賦值、反射賦值的示例分析的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

巴里坤哈薩克網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司成立與2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司

C#中字段、屬性和構(gòu)造函數(shù)賦值的問(wèn)題提出問(wèn)題如下所述:

首先提出幾個(gè)問(wèn)題:

1、如何實(shí)現(xiàn)自己的注入框架?

2、字段和自動(dòng)屬性的區(qū)別是什么?

3、字段和自動(dòng)屬性聲明時(shí)的直接賦值和構(gòu)造函數(shù)賦值有什么區(qū)別?

4、為什么只讀字段和只讀自動(dòng)屬性(只有g(shù)et沒(méi)有set訪問(wèn)器)都可以在構(gòu)造函數(shù)中進(jìn)行賦值?

5、反射可以給只讀字段或者只讀屬性進(jìn)行賦值嗎?

6、自動(dòng)屬性和普通屬性的區(qū)別?

這些問(wèn)題是我在試著寫(xiě)自己的注入實(shí)現(xiàn)時(shí)遇到的問(wèn)題。這些問(wèn)題應(yīng)該在學(xué)習(xí)C#時(shí)的第一節(jié)課就應(yīng)該學(xué)到了,我看網(wǎng)上還有人分享說(shuō)他在面試時(shí)遇到面試官問(wèn)為什么只讀字段和只讀自動(dòng)屬性可以在構(gòu)造函數(shù)中進(jìn)行賦值,他沒(méi)有回答上來(lái),然后他寫(xiě)文章探討這個(gè)問(wèn)題,卻沒(méi)有得出一個(gè)明顯的答案,實(shí)在可惜。網(wǎng)上關(guān)于只讀屬性有些是寫(xiě)ReadOnly特性的,讀到這些文章直接跳過(guò)吧,老版本的C#現(xiàn)在看也沒(méi)什么幫助。

給出答案

2、屬性比字段多了get/set訪問(wèn)器;字段是在內(nèi)存中聲明的一個(gè)內(nèi)存空間,可以實(shí)實(shí)在在的存儲(chǔ)值;屬性像字段一樣使用,卻可以有自己的代碼段,能賦值取值,是因?yàn)樵L問(wèn)屬性就是調(diào)用屬性的get/set方法對(duì)字段進(jìn)行取值賦值(或者不操作字段);在MSDN上,建議字段作為類的私有變量使用private/protected修飾,屬性則往往作為共有屬性使用public修飾;字段的讀取和操作都是直接操作內(nèi)存,屬性是調(diào)用get/set訪問(wèn)器,所以字段比屬性快。

3、準(zhǔn)確來(lái)說(shuō),沒(méi)有區(qū)別。區(qū)別僅僅是直接賦值先執(zhí)行,構(gòu)造函數(shù)賦值后執(zhí)行。在生成的IL中間語(yǔ)言(C#代碼先編譯成IL代碼,然后才編譯成匯編語(yǔ)言)中,字段直接賦值和構(gòu)造函數(shù)賦值是在同一個(gè)代碼段中(構(gòu)造函數(shù)中)的。

4、這個(gè)問(wèn)題可以和上面的問(wèn)題聯(lián)合起來(lái)回答。構(gòu)造函數(shù)作為實(shí)例化一個(gè)類的入口,是最先訪問(wèn)的。字段的直接賦值其實(shí)也是放在構(gòu)造函數(shù)中執(zhí)行的,所以才說(shuō)直接賦值和構(gòu)造函數(shù)賦值沒(méi)有區(qū)別。“只讀”的限制只是由C#編譯器(CLR)維護(hù)的,我覺(jué)得全名應(yīng)該叫做“除構(gòu)造函數(shù)外只讀”更加準(zhǔn)確,這是C#語(yǔ)法的規(guī)則記住就行(這是當(dāng)然,直接賦值其實(shí)是放在構(gòu)造函數(shù)中進(jìn)行賦值的,如果構(gòu)造函數(shù)不能賦值那只讀字段沒(méi)有值和沒(méi)有聲明一樣);

5、這個(gè)問(wèn)題又可以和上面的問(wèn)題聯(lián)系起來(lái)一起回答。通過(guò)反射可以給自讀字段賦值但是無(wú)法給只讀屬性進(jìn)行賦值(不相信的可以試一下)。對(duì)只讀字段的賦值是因?yàn)槔@過(guò)了C#編譯器(CLR)的只讀顯示,對(duì)只讀屬性賦值的話是還是調(diào)用set訪問(wèn)器對(duì)字段進(jìn)行賦值,因?yàn)闆](méi)有set訪問(wèn)器所以允許后會(huì)報(bào)錯(cuò)。那么問(wèn)題來(lái)了,那為什么只讀自動(dòng)屬性沒(méi)有set訪問(wèn)器還可以在構(gòu)造函數(shù)中賦值呢?其實(shí)只讀自動(dòng)屬性在構(gòu)造函數(shù)中進(jìn)行賦值,實(shí)質(zhì)上是對(duì)字段進(jìn)行賦值,和屬性的get/set訪問(wèn)器沒(méi)有關(guān)系。

6、區(qū)別是什么?上面一直強(qiáng)調(diào)自動(dòng)屬性,是因?yàn)樽詣?dòng)屬性和普通屬性不一樣,比如只讀普通屬性(沒(méi)有set訪問(wèn)器)無(wú)法在構(gòu)造函數(shù)中賦值。在沒(méi)有自動(dòng)屬性之前,普通屬性使用步驟是首先聲明一個(gè)字段如_id,然后聲明一個(gè)屬性Id,在get和set訪問(wèn)器中做一些操作,這些操作大多數(shù)是對(duì)字段_id的操作,但是有時(shí)候和字段沒(méi)有關(guān)系。普通屬性可以像字段一樣通過(guò)“.”的方式調(diào)用,但又像方法一樣具有代碼段(普通屬性從來(lái)不開(kāi)辟內(nèi)存空間)。

但是C#3.0之后引入了自動(dòng)屬性,聲明方式如public int id { get; set; },C#6.0之后又有了public string FirstName { get; set; } = "Jane"。自動(dòng)屬性肯定開(kāi)辟了內(nèi)存空間然后才有了自動(dòng)屬性的直接賦值。其實(shí)在類中聲明自動(dòng)屬性會(huì)在編譯成IL中間語(yǔ)言中聲明一個(gè)隱藏字段,然后生成隱藏字段的get/set方法,然后生成get/set訪問(wèn)器。這里可以解釋為什么只讀普通屬性無(wú)法在構(gòu)造函數(shù)中賦值(和直接賦值)而只讀自動(dòng)屬性可以在構(gòu)造函數(shù)中賦值(和直接賦值),因?yàn)椴徽撝苯淤x值還是在構(gòu)造函數(shù)中賦值,生成的IL代碼中的構(gòu)造函數(shù)中,操作的都是隱藏字段,并沒(méi)有訪問(wèn)屬性的set訪問(wèn)器。(注意這里只是說(shuō)的類中的自動(dòng)屬性,接口中也是可以有自動(dòng)屬性的,但是接口的自動(dòng)屬性并不會(huì)生成隱藏字段只是定義get/set訪問(wèn)器)

開(kāi)始解釋

通過(guò)C#生成的IL中間語(yǔ)言代碼可以知道的更清楚

 public class User
 {
  public int id = 0;
  public int age { get; set; } = 1;
  public User()
  {
   id = 2;
   age = 3;
  }
 }

C#中字段、屬性、只讀、構(gòu)造函數(shù)賦值、反射賦值的示例分析C#中字段、屬性、只讀、構(gòu)造函數(shù)賦值、反射賦值的示例分析

可以看到,自動(dòng)屬性會(huì)生成一個(gè)名稱為 '<age>k__BackingField' 的隱藏私有字段+私有字段的get/set方法+屬性代碼段;

可以看到IL代碼生成了User的構(gòu)造函數(shù) .ctor,ctor是構(gòu)造函數(shù)(Constructor)。

不論直接賦值還是構(gòu)造函數(shù)賦值,都是在.ctor中執(zhí)行的,并且操作的都是字段,自動(dòng)屬性的賦值操作的是隱藏字段。

 public interface IUser
 {
 int id { get; set; }
 }

C#中字段、屬性、只讀、構(gòu)造函數(shù)賦值、反射賦值的示例分析

可以看到,接口中的自動(dòng)屬性并沒(méi)有生成隱藏字段。

其他說(shuō)明

1、上文中提到“反射可以給只讀字段進(jìn)行賦值但是無(wú)法給只讀屬性進(jìn)行賦值”。無(wú)法給只讀屬性進(jìn)行賦值是因?yàn)闆](méi)有set訪問(wèn)器。但是我們已經(jīng)知道了可以給字段賦值,并且只讀屬性會(huì)生成隱藏字段,那我們是不是可以通過(guò)給隱藏字段進(jìn)行賦值間接達(dá)到給自動(dòng)屬性賦值的目的呢?答案是可以的!

定義User的只讀自動(dòng)屬性

 public class User
 {
  public int age { get; } = 1;
  public User()
  {
   age = 3;
  }
 }

控制臺(tái)的反射賦值代碼:   

 var user = new User();
   try { typeof(User).GetProperty("age").SetValue(user, 9); }
   catch{ Console.WriteLine("只讀屬性賦值失敗");}
   typeof(User).GetField("<age>k__BackingField", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(user,9);
   Console.WriteLine(user.age);
   Console.Read();

運(yùn)行

C#中字段、屬性、只讀、構(gòu)造函數(shù)賦值、反射賦值的示例分析

2、因?yàn)殡[藏字段是私有的,所以取到隱藏字段需要  BindingFlags.NonPublic

3、只讀自動(dòng)屬性說(shuō)明不想被訪問(wèn)到那為什么還要給它賦值呢?這個(gè)問(wèn)題……做著玩,項(xiàng)目中我覺(jué)得也沒(méi)有什么用到的機(jī)會(huì)……

感謝各位的閱讀!關(guān)于“C#中字段、屬性、只讀、構(gòu)造函數(shù)賦值、反射賦值的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

新聞標(biāo)題:C#中字段、屬性、只讀、構(gòu)造函數(shù)賦值、反射賦值的示例分析
鏈接地址:http://aaarwkj.com/article20/ipoojo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司網(wǎng)站維護(hù)、網(wǎng)站制作App開(kāi)發(fā)域名注冊(cè)、軟件開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司
成人做爰片免费看视频| 人妻少妇亚洲中文字幕| 亚洲免费视频区一区二| 亚洲高清成人综合网站| 黄色片黄色片美女黄色片亚洲黄色片 | 91精品久久久久久| 日韩精选视频在线播放| 国产精品亚洲视频欧美视频| 亚洲乱码一区二区三区人妇| 欧美亚洲五月婷婷激情| 高潮少妇水多毛多av| 精品人妻一区二区三区久久91 | 日韩电影中文字幕一区| 一区二区在线视频国产| 成年人免费在线观看毛片| 人人人妻人人澡人人爽e| 尤物欧美精品一区二区三区| 亚洲精品在线观看日本| 亚洲av十八禁在线播放| 欧美一区二区国产精品日韩| 国产精品久久一国产精品| 日本一区二区三区视频版| 亚洲天堂av在线观看| 饥渴少妇高潮露脸嗷嗷叫| 亚洲欧美日韩老汉影院| 亚洲人妻av一区二区三区| 又黄又爽区一区二区三| 中文字幕欧美人妻在线| 免费福利激情在线播放| 2018在线不卡爱视频| 日韩一区二区中文字幕| 91伊人激情综合久久| 中文字幕一区二区三区精彩视频 | 久久99精品久久久国产| 国产精品一级片一区二区| 五月婷婷六月丁香伊人网| 国产网红女主播视频一区二区| 亚洲乱码一区二区av| 六月丁香花五月婷婷| 日本高清有码中文字幕| 少妇38p高潮在线|