【記】《.net之美》之讀書筆記(一) C#語言基礎

前言

工做之中,咱們習慣了碰到任務就直接去實現其業務邏輯,可是C#真正的一些基礎知識,在咱們長此以往不去了解鞏固的狀況下,就會忽視掉。我深知本身正一步步走向只知用法殊不知原理的深淵,因此工做之餘,一直想找一些能深刻講解C#基礎知識和底層原理的書籍,有幸在網上看到了《.net之美》一書,(--張子陽做 )開始只是簡單的作了閱讀,可是越往下讀,發現書中所述都是本身所薄弱或者是工做中遇到可是解釋不清其原理的知識點,爲了加深本身的印象,故萌生出寫下讀書筆記的想法,也是爲本身的學習有個記錄,方便往後查閱,加深理解。程序員

一. C#語言基礎

1.1 C# 類型基礎

C#的類型共分爲兩種: 值類型和引用類型. 固然,區分他們的不一樣是以其在計算機內存中的分配方式不一樣面試

來劃分的c#

1.值類型老是分配到它聲明的地方:

a.做爲引用類型的成員變量分配到「堆」上函數

b.做爲方法的局部變量時分配到「棧」上學習

2.引用類型老是被分配到"堆"上
3.當聲明一個值類型的變量時,變量自己包含了值類型的所有字段,該變量將被分配在線程堆棧上。
4.當聲明一個引用類型變量,並使用new操做符建立引用類型實例的時候,該引用類型的變量會被分配到線程棧上,變量保存了位於堆上引用類型的實例的內存地址。變量自己不包含任何類型所定義的數據。
public class RefPoint
{
	public int x;
	public RefPoint(int x){
	this.x=x;
	}
	public RefPoint(){};
}

當僅聲明不實例化時,RefPoint r1; 只在線程棧上建立一個不包含任何數據,也不指向任何對象 (不包含內存地址)的變量this

當使用new操做符實例化該變量時,r1=new RefPoint(1);將完成如下幾件事.net

  • 在應用程序堆上建立一個引用類對象的實例,併爲其分配內存地址
  • 自動傳遞該實例的引用給構造函數。
  • 調用該類型的構造函數 public RefPoint(int x){}
  • 返回該實例的引用,賦值給r1變量。
5.裝箱和拆箱

裝箱就是將一個值類型轉換成等價的引用類型,拆箱則是將一個已裝箱的引用類型轉換爲值類型。線程

注:拆箱操做須要顯示聲明拆箱後轉換的類型。由於拆箱裝箱須要反覆在內存堆上進行,所以,在咱們實際的程序應用中,應該避免沒有意義的裝箱和拆箱操做,以此來減小咱們的內存消耗。code

6.引用類型判等

System.Object基類中,定義了實例方法Equals(object obj)、靜態方法Equals(object objA,object objB)、靜態方法 ReferenceEquals(Object objA,Object objB) 三種方法來判斷兩個引用類型是否相等。對象

做者給出了以上三種方法的具體實現,以下所示:

public static bool ReferenceEquals (Object objA, Object objB)
{
return objA == objB; // #1
}
public virtual bool Equals(Object obj)
{
return InternalEquals(this, obj); // #2
}
public static bool Equals(Object objA, Object objB) {
if (objA==objB) { // #3
return true;
}
if (objA==null || objB==null) {
return false;
}
return objA.Equals(objB); // #4
}

ReferenceEquals(),判斷的是兩個引用變量是否是指向了同一個變量,若是是,則返回true,這種相等就是引用相等。等同於==。

另外須要注意的就是 對於引用類型,即便類型的實例包含的值相等,可是若是變量指向的是不一樣的對象,即引用值針的地址不相等,那麼這兩個變量也是不相等的。

7.簡單值類型判等

簡單值類型:值類型的成員僅包含值類型;

複雜值類型:值類型的成員包含引用類型;

值類型的判等,會調用System.ValueType的Equals()方法。方法內容簡單的來說就是 先判斷兩個對象是否是同一個類型,若是不是,直接返回false,接着來判斷對象內全部的字段,利用反射機制取到值類型的全部字段,遍歷字段,進行字段與字段的比較。

8.對象複製

淺度複製:對於值類型成員,會複製其自己;對於引用類型成員,僅僅複製引用,而不在堆上從新建立對象。結果就是 新對象的引用成員和複製對象的引用成員指向了同一個對象。

相對的,深度複製:就是將引用成員指向的對象也進行復制。過程就是建立新的引用成員指向的對象,而後複製對象中所包含的數據。

9.常量性和原子性

對象的原子性:對象的狀態是一個總體,若是一個字段改變,其餘字段也要同時作出相應改變。

如何實施?? 添加一個構造函數,在構造函數中爲對象的全部字段賦值。

對象的常量性:對象的狀態一旦肯定,就不能再次更改了。若是想再次更改,須要從新建立新的對象。

如何實施??可將屬性中的set訪問器刪除,同時將字段聲明爲readonly只讀狀態。

二.小結

做者在這一章節主要講解了C#中的類型,包括值類型和引用類型,以及簡單類型和拆箱裝修的過程,以及後續的對象判等、深淺複製及對象的一些特性等。經過對此章節的閱讀,加深並鞏固了我對於C#這些基礎概念的理解,大學確定也學過這些,可是隨着步入工做後,慢慢接觸到的都是工做中的業務邏輯處理了,關心的也是業務邏輯該如何實現等,不多再有精力去回過頭瞭解基礎的一些知識點。

今天上午還在網上看到某個大佬發佈的一篇博文,大概意思就是30+的程序員面試的一些過程,看完感受感觸很深,雖然我今年27,離30+也不遠了,可是工做中,總感受本身一旦閒下來就很慌,是那種不知所措的內心慌,很想去看點關於基礎知識點的書籍,可是一看到知識點概念就看不進去了,偶爾還有其餘事情要忙,只能草草收場,等到下次再想起來的時候,已經記不清上次本身看到哪裏了,因此寫下這篇文章也是爲了防止本身再放棄,算是給本身一個鼓勵吧。

曾經問過一位博主大佬,爲何文章寫的那麼好,感受什麼都能拿來做文章的素材,再看看本身,雖然也在努力,可是沒有目標,沒有方向。2020年也快過完了,去年定下的目標也忘的差很少了,就但願接下來的時間裏,能抓緊時間,充實本身吧。