1. 程式人生 > >值型別、引用型別 和 里氏轉換

值型別、引用型別 和 里氏轉換

一、值型別和引用型別

值型別:在棧上存在的是值

引用型別:棧上存的是地址,堆上存在的是值

類和結構的區別

相同點:預設都有一個無引數的建構函式

不同點:

類:值型別的值存在棧上,引用型別 棧上存在的是地址,值在堆上

       類當中預設的有一個無引數的建構函式

       當在類中寫一個有引數的建構函式,預設無參的建構函式被幹掉了

       類中寫建構函式引數列表中引數個數可以不確定

 

結構中:在結構中預設的有一個無引數的建構函式

              當在結構中寫一個有引數的建構函式,預設的無引數的建構函式還有,沒有被幹掉

              在結構中寫建構函式,要把所有的欄位都要完全賦值

              類是引用型別,結構是值型別

物件的引用:

值型別傳遞拷貝,物件(引用型別)傳遞的是引用。

堆和棧的區別:

棧是編譯期間就分配好的記憶體空間,因此你的程式碼中必須就棧的大小有明確的定義,區域性值型別變數,值型別引數等都在棧記憶體中。

堆是程式執行期間動態分配的記憶體空間,你可以根據程式的執行情況確定要分配的堆記憶體的大小。

 

二、里氏轉換

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("我是老師");
            }
        }

    }
}