亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#中字段、屬性、只讀、構造函數賦值、反射賦值的問題

2019-10-29 21:01:41
字體:
來源:轉載
供稿:網友

C#中字段、屬性和構造函數賦值的問題提出問題如下所述:

首先提出幾個問題:

1、如何實現自己的注入框架?

2、字段和自動屬性的區別是什么?

3、字段和自動屬性聲明時的直接賦值和構造函數賦值有什么區別?

4、為什么只讀字段和只讀自動屬性(只有get沒有set訪問器)都可以在構造函數中進行賦值?

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

6、自動屬性和普通屬性的區別?

這些問題是我在試著寫自己的注入實現時遇到的問題。這些問題應該在學習C#時的第一節課就應該學到了,我看網上還有人分享說他在面試時遇到面試官問為什么只讀字段和只讀自動屬性可以在構造函數中進行賦值,他沒有回答上來,然后他寫文章探討這個問題,卻沒有得出一個明顯的答案,實在可惜。網上關于只讀屬性有些是寫ReadOnly特性的,讀到這些文章直接跳過吧,老版本的C#現在看也沒什么幫助。

給出答案

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

3、準確來說,沒有區別。區別僅僅是直接賦值先執行,構造函數賦值后執行。在生成的IL中間語言(C#代碼先編譯成IL代碼,然后才編譯成匯編語言)中,字段直接賦值和構造函數賦值是在同一個代碼段中(構造函數中)的。

4、這個問題可以和上面的問題聯合起來回答。構造函數作為實例化一個類的入口,是最先訪問的。字段的直接賦值其實也是放在構造函數中執行的,所以才說直接賦值和構造函數賦值沒有區別。“只讀”的限制只是由C#編譯器(CLR)維護的,我覺得全名應該叫做“除構造函數外只讀”更加準確,這是C#語法的規則記住就行(這是當然,直接賦值其實是放在構造函數中進行賦值的,如果構造函數不能賦值那只讀字段沒有值和沒有聲明一樣);

5、這個問題又可以和上面的問題聯系起來一起回答。通過反射可以給自讀字段賦值但是無法給只讀屬性進行賦值(不相信的可以試一下)。對只讀字段的賦值是因為繞過了C#編譯器(CLR)的只讀顯示,對只讀屬性賦值的話是還是調用set訪問器對字段進行賦值,因為沒有set訪問器所以允許后會報錯。那么問題來了,那為什么只讀自動屬性沒有set訪問器還可以在構造函數中賦值呢?其實只讀自動屬性在構造函數中進行賦值,實質上是對字段進行賦值,和屬性的get/set訪問器沒有關系。

6、區別是什么?上面一直強調自動屬性,是因為自動屬性和普通屬性不一樣,比如只讀普通屬性(沒有set訪問器)無法在構造函數中賦值。在沒有自動屬性之前,普通屬性使用步驟是首先聲明一個字段如_id,然后聲明一個屬性Id,在get和set訪問器中做一些操作,這些操作大多數是對字段_id的操作,但是有時候和字段沒有關系。普通屬性可以像字段一樣通過“.”的方式調用,但又像方法一樣具有代碼段(普通屬性從來不開辟內存空間)。

但是C#3.0之后引入了自動屬性,聲明方式如public int id { get; set; },C#6.0之后又有了public string FirstName { get; set; } = "Jane"。自動屬性肯定開辟了內存空間然后才有了自動屬性的直接賦值。其實在類中聲明自動屬性會在編譯成IL中間語言中聲明一個隱藏字段,然后生成隱藏字段的get/set方法,然后生成get/set訪問器。這里可以解釋為什么只讀普通屬性無法在構造函數中賦值(和直接賦值)而只讀自動屬性可以在構造函數中賦值(和直接賦值),因為不論直接賦值還是在構造函數中賦值,生成的IL代碼中的構造函數中,操作的都是隱藏字段,并沒有訪問屬性的set訪問器。(注意這里只是說的類中的自動屬性,接口中也是可以有自動屬性的,但是接口的自動屬性并不會生成隱藏字段只是定義get/set訪問器)

開始解釋

通過C#生成的IL中間語言代碼可以知道的更清楚

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

C#,字段,屬性,只讀,構造函數賦值,反射賦值C#,字段,屬性,只讀,構造函數賦值,反射賦值

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

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

不論直接賦值還是構造函數賦值,都是在.ctor中執行的,并且操作的都是字段,自動屬性的賦值操作的是隱藏字段。

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

C#,字段,屬性,只讀,構造函數賦值,反射賦值

可以看到,接口中的自動屬性并沒有生成隱藏字段。

其他說明

1、上文中提到“反射可以給只讀字段進行賦值但是無法給只讀屬性進行賦值”。無法給只讀屬性進行賦值是因為沒有set訪問器。但是我們已經知道了可以給字段賦值,并且只讀屬性會生成隱藏字段,那我們是不是可以通過給隱藏字段進行賦值間接達到給自動屬性賦值的目的呢?答案是可以的!

定義User的只讀自動屬性

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

控制臺的反射賦值代碼:   

 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();

運行

C#,字段,屬性,只讀,構造函數賦值,反射賦值

2、因為隱藏字段是私有的,所以取到隱藏字段需要  BindingFlags.NonPublic

3、只讀自動屬性說明不想被訪問到那為什么還要給它賦值呢?這個問題……做著玩,項目中我覺得也沒有什么用到的機會……

總結

以上所述是小編給大家介紹的C#中字段、屬性、只讀、構造函數賦值、反射賦值的問題 ,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中国日韩欧美久久久久久久久| 国产欧美在线播放| 高跟丝袜欧美一区| 亚洲国产精品人人爽夜夜爽| 成人免费网站在线| 亚洲xxxx3d| 欧美极品少妇与黑人| 成人黄色网免费| 正在播放欧美视频| 亚洲一二在线观看| 久久这里只有精品视频首页| 亚洲精品欧美日韩专区| 国产精品中文字幕在线观看| 国产区精品视频| 亚洲精品免费网站| 欧美亚洲国产精品| 欧美区在线播放| 亚洲精品中文字幕av| 国产一区二区三区网站| www.国产一区| 国内精品久久久久久| 最新的欧美黄色| 综合国产在线观看| 国产日韩欧美一二三区| 夜夜嗨av色综合久久久综合网| 国产91|九色| 国产精品毛片a∨一区二区三区|国| 国产成人精品av在线| 91免费版网站入口| 国产精品一区二区三区免费视频| 日本老师69xxx| 欧美一区二区三区免费观看| 最新69国产成人精品视频免费| 91精品国产99久久久久久| 国产精品久久色| 久久久久久久国产精品视频| 久久夜色精品国产欧美乱| 国产亚洲精品久久久久久777| 精品高清一区二区三区| 欧美日韩在线影院| 亚洲精品www久久久| 中文字幕亚洲精品| 亚洲精品第一页| 97av在线播放| 麻豆国产精品va在线观看不卡| 精品国产31久久久久久| 精品国产31久久久久久| 成人写真福利网| 久久精品国产亚洲精品2020| 在线看日韩av| 精品亚洲国产成av人片传媒| 久久精品国产一区| 久久深夜福利免费观看| 91精品国产综合久久香蕉| 亚洲伊人成综合成人网| 亚洲国产成人精品女人久久久| 伊人伊成久久人综合网站| 日本成人免费在线| 欧美日产国产成人免费图片| 美女撒尿一区二区三区| 亚洲精品动漫100p| 大桥未久av一区二区三区| 欧美一级免费看| 日韩av片电影专区| 久久久爽爽爽美女图片| 98视频在线噜噜噜国产| 精品美女国产在线| 精品国产欧美成人夜夜嗨| 亚洲第一福利网站| 欧美另类交人妖| 亚洲毛片在线观看| 欧美激情久久久久久| 成人精品久久久| 国产精品电影在线观看| 国模吧一区二区| 成人字幕网zmw| 国产在线一区二区三区| 亚洲国产天堂久久国产91| 2020国产精品视频| 欧美日韩国产精品一区| 欧美日韩福利在线观看| 欧美日韩福利视频| 欧美另类暴力丝袜| 日韩精品视频在线免费观看| 国产欧美一区二区| 97久久久免费福利网址| 亚洲精品一二区| 欧美黄色性视频| 国产日韩欧美自拍| 欧美—级高清免费播放| 亚洲一区二区自拍| 国产日韩在线视频| 中文在线资源观看视频网站免费不卡| 成人精品一区二区三区电影黑人| 久久久国产一区二区三区| 亚洲已满18点击进入在线看片| 91精品视频大全| 欧美激情第99页| 日韩在线视频线视频免费网站| 国产精品免费久久久久影院| 高清欧美性猛交xxxx黑人猛交| 自拍偷拍亚洲在线| 欧美另类交人妖| 亚洲精品www久久久久久广东| 91精品国产自产在线老师啪| 一区二区三区动漫| 久久久伊人日本| 亚洲一区中文字幕| 欧美性黄网官网| 亚洲欧美激情在线视频| 欧美视频专区一二在线观看| 日韩美女视频中文字幕| 亚洲无限乱码一二三四麻| 日韩中文字幕网址| 深夜精品寂寞黄网站在线观看| 国产91精品久久久久久| 日本免费久久高清视频| 福利一区视频在线观看| 欧美精品中文字幕一区| 欧美视频在线视频| 久久久久久有精品国产| 国产精品av在线| 欧美日韩免费看| 欧美另类极品videosbestfree| 欧美午夜久久久| 国产精品一区二区三区免费视频| 欧美一区二区三区免费视| 日韩视频在线免费| 国产精品日韩在线观看| 亚洲最大福利视频网站| 国内精品在线一区| 欧美在线中文字幕| 91精品国产高清久久久久久久久| 狠狠久久亚洲欧美专区| 中文字幕亚洲情99在线| 中文字幕欧美日韩精品| 亚洲激情 国产| 亚洲国产中文字幕久久网| 精品呦交小u女在线| 96sao精品视频在线观看| 日韩中文字幕视频| 久久久久久久爱| 欧美激情小视频| 亚洲福利视频专区| 亚洲精品成人免费| 亚洲国产精品99| 亚洲欧美中文日韩在线v日本| 97国产成人精品视频| 欧美老肥婆性猛交视频| 久久久91精品国产| 欧美精品第一页在线播放| 国产视频欧美视频| 一道本无吗dⅴd在线播放一区| 欧美精品久久久久| 国内免费久久久久久久久久久| 亚洲午夜精品久久久久久性色| 亚洲欧洲一区二区三区久久| 亚洲国产精品999| 欧美在线精品免播放器视频| 欧美精品福利视频| 精品香蕉在线观看视频一| 欧美亚洲另类视频| 中文字幕亚洲欧美在线| 国产精品视频成人|