值型別、引用型別 和 里氏轉換
阿新 • • 發佈:2018-11-25
一、值型別和引用型別
值型別:在棧上存在的是值
引用型別:棧上存的是地址,堆上存在的是值
類和結構的區別:
相同點:預設都有一個無引數的建構函式
不同點:
類:值型別的值存在棧上,引用型別 棧上存在的是地址,值在堆上
類當中預設的有一個無引數的建構函式
當在類中寫一個有引數的建構函式,預設無參的建構函式被幹掉了
類中寫建構函式引數列表中引數個數可以不確定
結構中:在結構中預設的有一個無引數的建構函式
當在結構中寫一個有引數的建構函式,預設的無引數的建構函式還有,沒有被幹掉
在結構中寫建構函式,要把所有的欄位都要完全賦值
類是引用型別,結構是值型別
物件的引用:
值型別傳遞拷貝,物件(引用型別)傳遞的是引用。
堆和棧的區別:
棧是編譯期間就分配好的記憶體空間,因此你的程式碼中必須就棧的大小有明確的定義,區域性值型別變數,值型別引數等都在棧記憶體中。
堆是程式執行期間動態分配的記憶體空間,你可以根據程式的執行情況確定要分配的堆記憶體的大小。
二、里氏轉換
1.如果父類中裝的是子類物件,則可以將這個父類轉換為物件的子類物件
2.子類可以賦值給父類
關鍵字:
is: 返回布林型別的值,True 能轉換,False 不能轉換
as:如果轉換成功,返回物件,否則返回null,但是不報異常
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _01里氏轉換 { public class Program { static void Main(string[] args) { //Person p = new Teacher(); //Teacher t = p as Teacher; //t.Say(); //Console.ReadKey(); Person p =new Teacher (); if (p is Teacher) { Teacher t = (Teacher)p; t.Say(); } else { Console.WriteLine("轉不了"); } Console.ReadKey(); } public class Person { private string _name; public string Name { get { return _name; } set { _name = value; } } private char _gender; public char Gender { get { return _gender; } set { _gender = value; } } private int _age; public int Age { get { return _age; } set { _age = value; } } public void Show() { Console.WriteLine("{0}歲的{1}是最純潔的{2}老師", _age, _name, _gender); } } public class Teacher : Person { int _salary; public int Salary { get { return _salary; } set { _salary = value; } } public void Say() { Console.WriteLine("我是老師"); } } } }