C#類型詳解


一、類型成員

類成員定義有(public、private、internal、protected)。

Public--對任何類和成員都是公開的,無限制

Private--是私有的,僅能由類內部代碼訪問,如果沒有聲明,默認使用此關鍵字

Internal--僅能在所屬命名空間內部訪問

Protected--可以由類或者其派生類中的代碼訪問

類成員--字段、方法、屬性

public class MyClass

    {

        public int MyInt = 2019;//字段

        public static string MyMain()

        {

            return "這是方法";

        }

        public int MyProperty { get; set; }//屬性

}

 

字段--一個只讀、可讀/寫的數據值

方法--對類型或對象狀態數據操作的一個過程實現

屬性--它可以像方法一樣操作類或對象的狀態數據,但看上去卻像字段一樣的書寫方式

二、類型操作(隱式轉換、顯示轉換、裝箱、拆箱)

隱式轉換--對於內置數值類型,如果要存儲的值無需截斷或四舍五入即可適應變量,則可以進行隱式轉換、小精度數據轉大精度也可進行隱式轉換

Int  Num=100;

Long Bignum= Num;

 

顯示轉換--顯示轉換也稱為強制轉換,強制轉換是顯式告知編譯器你打算進行轉換且你知道可能會發生數據丟失的一種方式。

Double Num=100.1;

Int a;

a=int.Parse(Num);

 

顯示轉換存在一定的風險性,如若出現失誤可能會拋出異常或者影響整個結果的精確性。假如在不知a的類型的情況下進行顯示轉換,但是轉換失敗則會引起程序拋出異常。

var a = "yi";

int b = int.Parse(a);

 

這是可以嘗試使用TryParse,這里返回的是一個bool,轉換成功則True

var a = "yi";

int b;

int.TryParse(a, out b);

 

類型操作轉換--裝箱、拆箱

public void Test()

        {

            //裝箱

            int a = 1;

            object obj = a;

 

            //拆箱

            object obj2 = 2;

            int b = (int)obj2;

}

 

首先我們得了解,值類型是分配在線程棧中的,不受垃圾回收機制管理。而引用類型分配在托管堆中的。

 

裝箱--簡單來說值類型轉換引用類型是裝箱,詳細來說是。先在托管內存中分配內存,然后將值類型的值復制到內存堆中,然后返回新對象的地址,這一過程為裝箱。

拆箱--拆箱並不是裝箱的逆過程,簡單說也是引用類型轉換為值類型為拆箱,詳細來說拆箱是獲取為裝箱部分的指針,然后將未裝箱部分的值復制到堆棧中。

三、類型轉換(Is,As)

類型轉換操作符--is、as

as--是將一個對象從一種類型轉換為另一種類型,如果轉換成功則返回該類型,否則返回null

A a=new A();

B b= A as B;//轉換正常則返回B類型,轉換失敗則返回null

 

is--是判斷一種類型轉換為另一種類型,如果轉換成功則返回True,否則返回False。

A a=new A();

If(B is A)//返回True False

{

}

 

保險起見可以先用is對類型轉換進行判斷然后再使用as進行類型轉換。當然這樣的話可能會造成更新的性能消耗。

更簡單的一次驗證並安全的操作:

A a=new A();

B b= A as B;

if(B!=null){}

else{}

 

四、類型分類

一切皆對象,每一個對象都對應一個類,所有的類都有一個基類--Object-System.Object

然后其下又可分為值類型(基本數據類型)、引用類型。

值類型:整型、浮點型、字符型、布爾型、結構體、枚舉

引用類型:數組、字符串、類、接口、委托

關於類型的詳解將在下一節中詳細講出。

五、擴展延伸(抽象類、類)

在這里我們詳細講解下類以及抽象類。同時與接口直接的區別和相同。

類-抽象類:

1、都可被繼承

2、抽象類不能被實例化,只是用來繼承的,普通類可以實例化

3、抽象類只含有方法聲明,沒有方法體。並且只能存在於抽象類中

4、繼承抽象類的子類必須實現抽象方法,除非子類也是抽象類

5、抽象類中可以包含抽象方法和實例方法

接口-抽象類:

相同

1、都可被繼承

2、都可以有聲明不實現的方法

3、都不可被實例化

4、子類必須實現其聲明的方法

不同:

1、一個類可以繼承多個接口,但是僅能繼承一個抽象類

2、抽象類可包含實例方法,接口不可包含

3、接口支持回調,抽象類不支持

既然有類、抽象類、接口,那么他們分別在什么時候使用呢?

類不用說了吧,普通情況下使用即可。

抽象類--如果需要設計大的功能單元,則使用抽象類。抽象類主要用於關系密切的對象。

接口--如果設計小而簡練的功能塊的話可以使用接口,接口適合為不想關的類提供通用功能

舉個例子:一個圍欄之間有很多的小動物,豬、狗、雞、貓。針對這個我們設計一段程序,豬、狗、雞、貓其都是動物,根據抽象類-設計大的功能單元。我們可以設計一個動物類的抽象類。然后在各自繼承下去寫自己的具體類(豬類、狗類、雞類、貓類)。那么我們要研究他們的叫聲,這里設計小的功能模塊。我們就可以使用接口來設計一個叫聲。然后每個每個東西去實現不同的叫聲(豬叫、狗叫、雞叫、貓叫)。設計實現大的功能單元我們選擇抽象類,設計實現小而簡練的功能塊我們選擇使用接口。

總結:

c#基礎知識詳解系列


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM