數往知來C#之接口 值類型與引用類型 靜態非靜態 異常處理 GC垃圾回收 值類型引用類型內存分配<四>

C# 基礎接口篇

1、多態複習
使用個new來實現,使用virtual與override
   --》new隱藏父類方法 根據當前類型,電泳對應的方法(成員)
   --》override重寫 不管什麼狀況,都是執行新的方法(成員)
算法

繼承是實現多態的一個前提,沒有繼承多態是不能實現的
父類與子類實現多態
抽象類與子類實現
抽象類不能實例化
抽象類中的抽象方法沒有方法體
數據庫

抽象類的成員有哪些
  -》包含非抽象成員
  -》不能實例化
  -》子類必須實現父類的 抽象方法,除非子類也是抽象類
抽象成員有哪些呢?(凡是與方法有關的均可以抽象)
方法、屬性、索引、事件
自動屬性與抽象屬性
這個字段只須要實現讀和寫的功能不須要其餘控制的時候就可使用自動屬性
ide

2、接口
1)接口的關鍵字:interface 
2)接口的命名以I開頭
3)成員符沒有訪問修飾符
4)沒有方法實現體
5)接口裏的成員必須是抽象的
6)接口定義能力即方法 派生類必須實現接口方法,除了抽象類
7)接口的存在就是爲了實現多態
8)繼承能夠解決繼承體積龐大的其問題,好比說有一個算法類裏面有不少功能很齊全的計算方法,我如今要實現1+1=2的計算,此時若是調用這個功能齊全的類庫來實現,那麼無疑使大材小用了
也會產生不少的冗餘代碼,那麼就能夠考慮用接口來實現,接口的單一原則,接口實現的功能越少越好,通常一個接口實現一個功能,通常接口裏面不要超過兩個方法
優化

接口能夠實現多繼承:
語法:
  
lua

[public] [static] class 類名:[基類名,][[接口名,]接口名....]

接口比抽象類還抽象,接口是對功能的抽象spa

顯示實現接口:
  -》爲了不接口的方法名相同
  -》顯式實現接口必須由接口類型調用
顯示實現接口的方法不能一public修飾,方法名以接口名.方法名
  
操作系統

interface IInterface1
    {
        void Func();
    }
    interface IInterface2
    {
        void Func();
    }

    class MyTest : IInterface1, IInterface2
    {
        void IInterface1.Func()
        {
            Console.WriteLine("我是IInterface1提供的Func");
        }

        void IInterface2.Func()
        {
            Console.WriteLine("我是IInterface2提供的Func");
        }
    }

  

添加代碼段.net

C# 值類型_引用類型篇

3、值類型、引用類型
值類型就「複製文件」
-》值類型來源於Vluar Type
引用類型就是「複製快捷方式」
->引用類型來源於object
使用ref與out均可以將參數傳入方法,並保留在方法中對參數賦值時的影響
即參數在方法中被修改了,方法結束後,結果仍然保留方法中最後那一次被修改的值
ref reference 引用方法中用的是變量的引用,就是快捷方式
Out 參數用來輸出,即在方法中對變量的修改就是要傳到外邊輸出的
ref 在使用前要賦值
out 在方法中使用前要賦值
線程

static void Main(string[] args)
{
int num = 0;
Func1(ref num);

int num1;
Func2(out num1);
}

static void Func1(ref int n)
{
n = 10;
}

static void Func2(out int n)
{
n = 10;
}

C# 靜態與非靜態篇

wps5A12.tmp

3、靜態與非靜態
static修飾的成員就作靜態成員
靜態成員做用於整個應用程序
    -》在程序裏那裏均可以調用它
3d

如何定義靜態成員?
  -》加static修飾

靜態成員與實例成員調用關係?
  -》靜態方法、靜態類中不要容許直接調用靜態成員,若是要調用必需要new對象由對象來調用
如何調用靜態成員?
  -》類名.成員名

靜態成員屬於整個類

實例成員屬於對象

當某個類的成員都是靜態成員不須要實例化的時候就能夠把這個類定義成靜態類,在程序中重複使用
static與abstract級別相同
   -》只能由其中一個修飾

與public和internal沒有關係

靜態類不容許繼承
靜態類裏面不容許有實例成員

靜態構造方法
  -》不容許帶參數
  -》只容許由static修飾,沒有public修飾等

靜態構造方法從程序開始到結束只會被執行一次(一訪問這個類就會第一個執行靜態方法)

Dotnet基礎_異常處理篇

4、異常的處理
  1)try-catch
  2)try-catch-finally
  3)tre-finally

try
  {
     //可能出現異常的額代碼
  //打開數據庫,操做數據等
  //一旦出現異常,就從異常處停下來跳到catch中,tyr中其後的代碼就再也不執行了
  }
  catch(Exception ex)
  {
      //一旦出現異常,就執行這裏的代碼
   //通常作日誌等
  }
  finally
  {
    // 釋放資源
  }

 

異常向上拋,若是上面(調用者)沒有(catch)抓住,那麼就會再向上面拋,若是上面一直都沒有抓住就會拋到系統去,系統就會檢索這個異常,給出解決方案
若是系統解決不了就會拋給微軟
無論拋異常或者return   finally始終都會被執行,(能夠用if判斷的錯誤儘可能不要用try-catch)

C#_GC垃圾回收篇

3、GC   垃圾回收
垃圾回收老是從第0代開始回收
每次進行垃圾回收,前一代若是不使用了,就會被清掉,
若是,前一代中,某些對象仍然在使用中,就將其晉升爲下一代。

如何自動的釋放資源
   -》.net中對象有代的概念,每個代是有內存範圍的
   -》.net中的代有0、一、2三個等級
   -》2代的內存最大
   -》每次建立的對象默認爲0代,當對象到達0代滿了的時候會自動觸動回收第0代
   -》「回收」實際上就是將須要繼續使用的對象統一移動到另一段連續的內存中
   -》全部的地址指向都會發生變化(這個移動有時叫作壓縮)
   -》如此操做,當第一代滿的時候就會調用回收第一代,並將須要使用的的對象放在第二代裏
   -》如此操做,第二代滿的時候,就會拋出一個overflow異常
當對象字節數大於85000,此時該對象將存儲在大對象託管堆中
在進行垃圾回收的時候,不去考慮大對象區的數據(除非大對象區的數據小於85000)
   21250個int類型的對象==85000字節

      // 16個
            MyClass n1 = new MyClass();
            MyClass n2 = new MyClass();
            MyClass n3 = new MyClass();
            MyClass n4 = new MyClass();

            MyClass temp = n2;

            n2 = null;
            // 0x0012
            // 手動調用垃圾回收器
            System.GC.Collect(0);
            // 會根據你當前系統中內存使用狀況進行優化
            n1 = null;
            System.GC.Collect(0);
            System.GC.Collect(1);
            Console.ReadKey();

wps5A42.tmp

C# 值類型引用類型內存分配篇

複習 值類型與引用類型
引用類型就是在處理地址
   --》快捷方式與文件的關係
   --》對象在內存中作了什麼
32位的計算機用32個2進制位表示一個整數,同時使用32個二進制位來描述一個地址

一、內存空間的分配:分爲3個空間
在棧空間中,系統是按高位到低位分配內存空間的(就是從大的數到小的數)
在堆空間中,系統是按低位到高位分配內存空間的(就是從小到大的數)

1)一個內存空間用來存放當前執行方法中的代碼
     -》叫線程棧
     -》一個方法一個線程棧

程序在一開始執行就會去檢索每一個方法當中有哪些變量,而且爲這些變量分配內存空間,至關於開闢好意見意見的空房間給這些房間編號(就是地址),
而後把內存裏的數據清零(注意是清零至關於把裏面的數據變成這樣 0x0000,因此程序並無執行到這個變量以前,光標放到這個變量上去會看到這個變量的值是 0,
可是此時的變量並非賦值,並不能夠用,由於這個0是內存空間裏清除數據的0x0000,而不是賦值,等執行了等號以後纔會真正地爲這個變量賦值)

2)一個空間用來存放對象
       -》託管堆
對象就是一個變量的值,好比說 int num=10;  new person();   這個10和new person();就是對象。

3)存放靜態對象,大對象(大於85000字節)等

二、值類型:
  

static void Main()
  {
       int num=10;
  }

  

上面這段代碼,程序執行到Main放法系統就會開闢一個線程棧,這個線程棧用來存放這個方法執行的代碼,
程序一開始就會檢索方法裏面的全部變量,而後爲int num開闢一個內存,系統會把這個內存裏面的數據清除 0x0000,
而且給這個內存空間一個地址(至關於給這個內存空間編了個號)。

值類型的變量直接存在線程棧中,其中的值也存在線程棧中。數據在聲明的時候系統就會根據聲明的類型開闢相應大小的內存空間。
三、引用類型
    -》引用類型分爲兩個空間來存儲,變量存儲在線程棧中,對象存儲在託管堆中

class Person()
 {
 }
 static void Main()
 {
    Person p=new Person();
 }


程序一開始在棧空間中開闢一個內存把裏面的數據清零(0x0000),而後把這個p存到棧空間裏去,當程序執行到main方法裏面的時候會先執行new Person();(就是在new對象)
此時在就會在堆空間中開闢一個空間把數據清零,而後分配字段,,構造方法初始化,併產生一個地址,new對象時返回一個地址,這個地址指向了這個對象,而後執行等號賦值,此時賦值是把堆空間中這個對象產生的地址賦給變量p。此時變量P中存的是地址
咱們處理的時候實際上是對這個地址進行處理。
因此咱們在傳參的是時候是把變量中的值複製一份傳過去,就是把這個地址複製了一份賦給方法中接收的變量,此時在方法中對這個變量是對地址的處理,因此會在外面保留影響

2、對象的建立(new對象的時候其實在內存裏面作了不少事)
--》尋找類的繼承關係,從上往下計算全部的字段的字節數
--》再把這個數加上8個字節(若是是64位操做系統加16) (這裏8個字節方法棧4個指針佔4個)
--》而後向操做系統申請空間
--》若是空間已滿,返回一個overflow異常
--》若是空間夠了就會返回該空間的首地址
--》根據計算出來的長度,會把這一片的內存空間清零
--》Nextobjptr會在原來的地址位置加上剛剛計算出來的數據,獲得下一個對象的首地址
--》調用構造方法

多個對象在內存中時連續存儲的

wps5A62.tmp

wps5A73.tmp

wps5A83.tmp

wps5AA4.tmp

wps5AA5.tmp

相關文章
相關標籤/搜索