国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - C#中字段、屬性、只讀、構造函數賦值、反射賦值的問題

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

2022-02-28 13:23GetPower C#

這篇文章主要介紹了C#中字段、屬性、只讀、構造函數賦值、反射賦值的問題 ,非常不錯,具有一定的參考借鑒借鑒價值,需要的朋友可以參考下

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中間語言代碼可以知道的更清楚

?
1
2
3
4
5
6
7
8
9
10
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中執行的,并且操作的都是字段,自動屬性的賦值操作的是隱藏字段。

?
1
2
3
4
public interface iuser
{
int id { get; set; }
}

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

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

其他說明

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

定義user的只讀自動屬性

?
1
2
3
4
5
6
7
8
public class user
{
 public int age { get; } = 1;
 public user()
 {
  age = 3;
 }
}

控制臺的反射賦值代碼:   

?
1
2
3
4
5
6
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#中字段、屬性、只讀、構造函數賦值、反射賦值的問題 ,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!

原文鏈接:https://www.cnblogs.com/gdpw/p/9463145.html

延伸 · 閱讀

精彩推薦
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
主站蜘蛛池模板: 午夜网址 | 黄篇免费观看 | 亚洲久草视频 | 欧美日韩精品一区二区三区蜜桃 | 久久99精品久久久久久园产越南 | 亚洲欧美一级久久精品国产特黄 | 亚洲激情视频在线 | 激情在线视频 | 亚洲成av人片在线观看 | 国产黄色av| 91午夜伦伦电影理论片 | 国产一区二区免费 | 亚洲精品国产第一综合99久久 | 亚洲欧美激情精品一区二区 | 综合五月网 | 国产高清无密码一区二区三区 | 日本欧美在线 | 欧美精品网站 | 亚洲免费在线视频 | 在线欧美日韩 | 亚洲国产精品久久久 | 日韩在线观看视频一区二区三区 | 亚洲精品久久久久久动漫 | a免费视频| 色综合天天天天做夜夜夜夜做 | 依人久久久 | 久久久国产精品 | 91亚洲精品在线 | 国内久久精品 | 久久男人免费视频 | 激情五月婷婷丁香 | 国产精品日韩 | 日韩资源 | 91 在线| 欧美 日韩 国产 一区 | 久国产精品韩国三级视频 | 色综合社区 | 久草免费在线 | 欧美黄色影院 | 国产中文| 欧美高清一区 |