第二章:深入C#数据类型
封装:
官方定义:
封装又称信息隐藏,是指利用抽象数据类型(自定义类UserInfo)将数据和数据的操作结合在一起,使其构成一个不可分割的独立实体,尽可能的隐藏内部的细节,只保留一些对外接口,使之于外部发生联系。
两种体现:
1.把方法和属性封装到类中
2.将私有字段封装成共有属性
封装的优点:
第一:代码重用;
第二:不必关心具体的实现; (方法)
第三:面向对象三大特征之一;
第四,具有安全性!
数组:
int [] num={1,2}
num:当中保存的是内存中的地址如:0X001
nums[0]:访问的是堆中的内容
下面是一幅引用类型的内存原理图供参考(下面图片会引发部分人不适,请在家长陪同下观看,说白了就是画的丑):
再献上一副数组赋值原理图(只是将栈上的内容赋值一份):
结构体:
01.结构体不用new,就可以直接对其属性赋值
02.结构体中可以有字段,属性和方法
03.结构体是值类型,类是引用类型
04.在结构体中不能给字段赋初值,但是类中可以.
05.结构体中没有默认构造函数,但类中有默认构造函数
1.如果被struct修饰,那么他就是结构体
2.结构体是一种数据类型,并且他是值类型(枚举也是值类型)
3.有两种特殊的值类型:枚举和结构体
4.当类中属性个数比较少的时候,定义成结构体
public struct Dog { }
给大家分析一下引用类型和值类型:
引用类型:栈和堆都开空间
1.string
2.数组
3.接口
4.用户自定义类
值类型:只在栈开空间
1.int
2.double
3.boolean
4.结构体
5.枚举
所有数据类型的父亲都是Object
所有的值类型直接的父亲是ValueType,爷爷是Object
构造函数:
默认如果定义了一个类,系统会自动的生成一个和该类名称相同,并且没有返回值类型,甚至连Void都没有的方法,该方法就称为构造函数!
1.方法没有返回值,连void都没有
2.方法名和类名相同
构造作用:初始化变量用的
public class Dog { public string Name { get; set; } public int Age { get; set; } public Dog(string name, int age) { this.Name = name; this.Age = age; } }
class Program { static void Main(string[] args) { Cat cat; cat.name="小白"; cat.Say(); Console.ReadLine(); Dog dog = new Dog("大黄", 15); } }
装箱和拆箱:
箱子是引用类型,将值类型值装进引用类型变量里就称为装箱
装箱:将值类型(栈)转换成引用类型(栈堆)
拆箱:从引用类型(栈堆)转换成值类型(栈)
什么时候应该装箱,什么时候应该拆箱?
解析:由于装箱和拆箱过程都要损耗系统的性能,所以在开发中应该尽量避免装箱和拆箱。
面试题:
int number=3; 值类型的直接父类:ValueType,ValueType的父亲是Object
Console.WriteLine(number.ToString());
结论:没有装箱
7.值类型传递和引用类型传递:
值传递和引用传递的区别:有没有ref关键字,有ref是引用传递
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //Cat cat; 6 //cat.name="小白"; 7 //cat.Say(); 8 //Console.ReadLine(); 9 10 //Dog dog = new Dog("大黄", 15); 11 12 13 int num1 = 1; 14 int num2 = 2; 15 Console.WriteLine("num1="+num1+",num2="+num2); 16 17 //方法调用 18 Change(ref num1, ref num2); 19 20 Console.WriteLine("num1=" + num1 + ",num2=" + num2); 21 Console.ReadLine(); 22 23 } 24 25 //方法定义 26 private static void Change(ref int num1, ref int num2) 27 { 28 int temp = num1; 29 num1 = num2; 30 num2 = temp; 31 } 32 }
收工!