(一)构造方法的使用
构造方法又称之为构造函数;所谓构造方法,要求和这个类的名字完全一致,在new的时候回用到这个;如果没有构造的话,系统会默认构建一个;
- 对象创建时,首先初始化成员变量,然后调用构造函数;
- 因此,在构造方法中可以添加任意需要的初始化内容;
- 通过使用构造方法,可以简化对象初始化代码
实例化一个对象实际上就是调用这个对象的构造方法;
构造函数可以重载、使用带参数的构造函数
namespace Demo
{
/// <summary>
/// 学生类
/// </summary>
class Student
{
public Student()
{
this.StudentId = 1001;
this.StudentName = "guobaoyan";
}
public Student(int stuId, string stuName)
{
this.StudentId = stuId;
this.StudentName = stuName;
}
public int StudentId { get; set; }
public string StudentName { get; set; }
public int Age { get; set; }
}
}
namespace Demo
{
class Program
{
static void Main(string[] args)
{
Student objStudent = new Student();
Student objStudent1 = new Student(101, "guo");
Console.WriteLine(objStudent.StudentName);
Console.WriteLine(objStudent1.StudentName);
}
}
}
在重载的过程中,为避免代码重复,可以使用如下方法:
- 在执行的过程中,首先执行冒号后面的所调用的构造方法;
有参数构造方法总结:
- 参数的类型和顺序同样需要和定义规范一致;
- 有参数的构造方法可以让用户轻松选择何种方式完成对象的初始化工作;
- 使用有参数的构造方法能有效避免用户单个初始化对象属性的麻烦;
- 如果想要约束用户创建对象时必须完成某些属性的初始化工作,则可以去掉无参数构造方法;
(二)this关键字的总结
当成员变量和局部变量重名时使用this关键字:
this 关键字表示当前类的对象,用于访问该类成员变量或方法:
(三)构建方法与实例方法的总结
1)构造方法
- 用于对象的初始化,一个类中至少有一个构造方法;
- 不能显式调用,只能在创建的时候使用 new 来调用;
- 构造方法不能有返回值;
- 构造方法的名称必须与类名一样;
2)实例方法
- 用于表示对象能够干什么,一个类中可以没有任何实例方法;
- 只能显式调用:对象名.方法名;
- 可以有返回值,没有时必须使用void关键字;
- 方法名命名要有意义,一般是“动词+名词”形式,不能与类名相同,使用Pascal规范命名;
(四)对象初始化器的使用
对象在创建时也可以通过对象初始化器完成“属性初始化”
三种方法对比:
- 第一个是传统方法;第二个是构造方法;第三个是初始化器
对象初始化器与构造方法的异同点:
相同点:
- 都可以完成对象属性的初始化;
不同点:
- 构造方法(函数)具有强制性;而对象初始化器并没有强制性;
- 对象初始化器只能完成属性初始化;构造函数可以完成任何需要的初始化工作,如对象创建时读取文件等;
- 对象初始化器是 在创建对象的时候使用,而构造方法写在类里面;
- 对象初始化器只有在.NET 3.0版本以上才可以使用;构造方法在1.0版本就有;
(五)对象的销毁
对象创建时,在内存中创建;对象在内存中不断“生生死死”,具有生命周期;
对象在内存中的状态:
- 正在引用:程序正在使用的对象;
- 游离状态:没有引用的对象,已经使用完毕,但是依然占据空间;
游离状态的对象,会被垃圾回收机制(GC)清理
- .NET虚拟机特有的机制,自动运行,并检查对象的状态;
- 发现对象不再引用时,会释放其所占用的空间(销毁)
GC 的使用大大减轻了程序员手动释放对象的操作,且程序运行稳定;
使用using,调用Dispose()方法,可以立即调用GC,释放内存;
- 并不是所用的对象都可以使用using,只用当对象实现了IDispose接口之后,才能使用using;
在C++中,析构函数:当使用delete关键字删除对象的时候,析构函数会自动调用
- 托管运行环境下,对象的销毁由虚拟机负责,析构函数的用处不大;
(六)对象的数据类型
对象也是一种数据类型,即类类型;
对象是引用类型:实际上并没有创建一个新的内存空间,这两个实际上指向的是一个内存空间;将自己的内存地址赋给新的变量(类似c++ 中的指针)
(七)ref 和 out 关键字
1)ref 关键字
使用 ref 关键字可以将值类型按照引用方式进行传递;
注意:实际上我们通常使用的函数使用是形参,传入的参数是实参,这两个之间只是值的传递;形参的变化并不会引起实参的变化;
2)out 关键字
使用 out 关键字可以让方法有多个返回值;
注意:
- out 关键字其实也是使用引用方式传递;
- 实践开发不建议经常使用;
- 可以使用“字典集合”返回多个参数;
(八)类与对象的总结
1)深入理解封装:
- 封装的概念和作用:根据需要使用private 或public修饰符来修饰类的成员(字段、属性、方法等),这样有效避免私有数据和方法被外界使用,我们把这种使用特性称之为“封装”。
- 封装是一个概念:一个属性、一个方法也是封装;类是对属性和方法的封装;类也可以封装在特定模块中;
- 封装可以更好地保证程序的安全和知识产权的保护;
- 封装是面向对象的一个重要特性,面向对象有三个重要特征:封装、继承和多态;
2)面型对象编程的好处
封装使得开发人员可以更加关注自己的需求:
- 类的方法实现某个特定的功能;其他的类可以完全不用关心它是 如何实现的,只需要调用即可;
- 团队开发中,类的编写者可以完全不用关心别人如何使用;
一个类定义以后可以多次使用, 避免重复编码;
3)类视图
作用:通过视图方式展示类的组织结构;
注意:.NET平台规定,所有类都必须自动继承自object类;
4)装箱和拆箱的操作
开发中尽量减少使用“装箱”和“拆箱”,频繁的装箱和拆箱操作会影响程序的性能;
定义:
- 将值类型的变量转换为对象的过程称为“装箱”;将对象类型转换为值类型的过程称之为“取消装箱 ”;