1、对象的引用
类是引用类型,结构是值类型
举例:结构版的Person的赋值 与 类版的Person的赋值
int、decimal、bool、double byte 枚举结构等类型(值类型)是传递拷贝(复制),对象(引用类型)是传递引用(传递地址)。
class/struct Person
{
string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
char _gender;
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
public void Show()
{
Console.WriteLine("{0}的{1}在宜春是最纯洁的{2}李老师",_age ,_name ,_gender );
}
}
static void Main(string[] args)
{
Person p1 = new Person();
p1.Age = 20;
p1.Gender = '男';
Person p2 = new Person();
p2 = p1;
Console.WriteLine(p1 .Age );
Console.WriteLine(p1 .Gender );
Console.WriteLine("====================");
Console.WriteLine(p2.Age );
Console.WriteLine(p2.Gender );
Console.ReadKey();
}
结果显示都为:20 男
值类型的值存在栈上,引用类型 栈上存的是地址,值在堆上
static void Main(string[] args)
{
Person p1 = new Person();
p1.Age = 20;
p1.Gender = '男';
Person p2 = new Person();
p2 = p1;
p2.Age = 100;
p2.Gender = '女';
Console.WriteLine(p1 .Age );
Console.WriteLine(p1 .Gender );
Console.WriteLine("====================");
Console.WriteLine(p2.Age );
Console.WriteLine(p2.Gender );
Console.ReadKey();
}
struct 时,显示为20 男 和 100 女
说明:p1.Age=20; p1.Gender='男';
P2=p1 将 p1 的值 赋值给了 p2
后又加 p2.Age=100; p2.Gender=‘女’; 重新给 p2 赋值
class 时,显示为100 女 和 100 女
说明:
p1.Age=20; p1.Gender='男';
P2=p1 将 p1 的地址 给了 p2 因此p1 和 p2 的值都是 20 男
后又加 p2.Age=100; p2.Gender=‘女’;即p2 重新赋值了
因 p2 和 p1 的地址相同了,所以 p1 和 p2 的值等同
类和结构异同
同:默认都有一个无参数的构造函数
异:在类和结构中写一个有参数的构造函数时,默认的无参函数(类中的被干掉了,结构中的没被干掉)
字段赋值(结构中所有的字段全部赋值,类中可以不用吧所有字段都赋值)
2、 堆和栈的区别
栈是编译期间就分配好的内存空间,因此代码在必须就栈的大小有明确的定义;局部值类型变量 、值类型参数等都在栈内存中。
堆是程序运行期间动态分配的内存空间,可以根据程序的运行情况确定要分配堆内存的大小。
3、 值类型和引用类型的区别
1)将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制给对象的引用,而不复制对象本身。
2)值类型不可能派生出新的类型:所有的值类型均隐式派生自 System. ValueType。但与引用类型相同的是,结构也可以实现接口。
3)值类型不可能包含 null 值 如:int number=null 是错误的
4)每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
继承
class Student:Person{……};
class Teacher:Person{……};
继承的符号 :
子类继承了父类的成员,子类还可以有自已的成员。
Person叫做父类(基类)Student 和 Teacher 叫做子类(派生类)
Student继承了Person类,Person类派生类Teacher类
注:在C#中,所有的类都直接或间接的继承了Object类。(当我们定义一个类的时候,如果没有写继承一个类,那么这个类就继承了Object类)
注:继承的传递性;继承的单根性(只有一个父类)