一、值类型和引用类型

值类型:在栈上存在的是值

引用类型:栈上存的是地址,堆上存在的是值

值类型、引用类型 和 里氏转换

类和结构的区别

相同点:默认都有一个无参数的构造函数

不同点:

类:值类型的值存在栈上,引用类型 栈上存在的是地址,值在堆上

       类当中默认的有一个无参数的构造函数

       当在类中写一个有参数的构造函数,默认无参的构造函数被干掉了

       类中写构造函数参数列表中参数个数可以不确定

 

结构中:在结构中默认的有一个无参数的构造函数

              当在结构中写一个有参数的构造函数,默认的无参数的构造函数还有,没有被干掉

              在结构中写构造函数,要把所有的字段都要完全赋值

              类是引用类型,结构是值类型

对象的引用:

值类型传递拷贝,对象(引用类型)传递的是引用。

堆和栈的区别:

栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义,局部值类型变量,值类型参数等都在栈内存中。

堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。

 

二、里氏转换

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

    }
}


 

 

 

相关文章: