C# 复习笔记2

面向对象编程:类和对象(一)

  • 背景:C语言把重点放在写函数上,较大的任务被分解成若干小任务,每个任务均由函数实现,这种分而治之的编程思想称为结构化编程。
  • C语言模块化编程:一个功能模块统一放一个C文件中,这个模块相关的函数全部在这个C文件中实现,在主文件(即有main函数的C文件)想要使用这个模块的功能函数,只需要包含它的头文件就可以调用了,那头文件就只是放这个功能模块的函数声明。
  • 面向对象的基本概念:类、封装、接口和对象
  • 类:属性+行为;数据+函数
  • 封装:汽车的运行原理已经被伟大的工程师封装在汽车内部,提供给司机的只是一个简单的使用接口,司机操纵方向盘和各种按钮就可以灵活自如的开动汽车了。
  • 接口:在面向对象编程中,只要保持接口不变,你可以任意改变类的实现细节,用一个设计更好的类替换原来的类,实现类的升级换代。

面向对象基本概念

  • 类:C# 中把类的成员变量称为Field(字段);
  • 把变量或方法标记为private,可以有效确保它们只在类内部工作,编译器不允许类以外的任何代码访问他们,从而确保这些数据不被外界所修改,大大增强了程序的健壮性。另外只要保持公有成员(接口)不变,对类内部进行任何优化都不会对外界产生影响,所以我们一般尽量把类的成员设计为私有,以利于类的升级改造。哪些成员为公有,哪些成员为私有,需要精心考量。
  • 属性:原则上我们可以随时访问类的公有成员,但这种不加限制的访问可能会造成问题,比如:
  •  kitty.age = -10
    
  • 如何对赋值进行合法性检查呢?一种办法是把变量age声明为私有,并定义一个公有方法来访问它。用公有方法读写变量不但可以对数据进行合法性检查,而且提高了类的封装性,一箭双雕。这种专门用来读写数据的方法称为访问器。
  • 访问器虽然解决了变量age 的访问问题,但是人们还是习惯于把年龄作为一个变量对待,用方法访问不符合人们的思维习惯。为了解决这个问题,C#设计了一种特殊的语法——属性(Property)
//属性Age
public int Age
{
	get
	{
		return age;
	}
	set
	{
		if (value <= 0)
			age = 0;
		else
			age = value;
	}
}
  • 在属性中,定义了get和set两个访问器,get访问器用来读取变量的值,set访问器用来设置变量的值,合法性检查的代码定义在两个访问器中,需要提醒的是set访问器没有声明显示参数,但它有一个名为value的隐式参数。
  • 属性的运行方式和方法相似,因此属性可以看作特殊的方法,但属性的使用方式和变量完全相同。
Cat kitty = new Cat();
kitty.Age = 3;
int age = kitty.Age;
  • 属性既有封装性,又可进行合法性检查,还符合变量的使用习惯,达到了一箭三雕的效果。习惯上,我们一般把类的所有变量均设为私有,然后通过公有属性来访问它们。

  • 自动属性:有时候属性很简单,get和set里面只有取值和赋值,没有其它逻辑代码,这种属性可以通过自动属性来快速定义。

  •   public int Name{get;set;}
    
  • 垃圾回收机制:当对象即将离开作用域时,系统自动调用对象的析构函数,释放对象所占的资源。然而在大型的程序中,有时有些对象虽然不再使用了,但离作用域结束还有相当长的时间,在这期间,对象仍然占用内存,浪费资源。

  • 在C++中,程序员需要显式的用delete语句删除垃圾对象,如果程序员忘记了及时删除,这些垃圾对象有可能占用大量的内存空间,造成“内存泄露”。

  • 为了解决这个痼疾,C#专门设计了一套回收资源的机制——垃圾回收器。当垃圾回收器确定某个对象已经无用时,就会自动删除该对象,释放内存空间。

类的实例演练

  • 用属性的好处
  • 辅助函数的好处:SetTime()——方便类升级

你可能感兴趣的:(C#,复习)