7 .Net学习第七天
7.1 面向对象的概念
C#是一种面向对象的语言
对面向过程的语言而言,其思想与人的常规思维一致,但是针对不同的目标,需要对每个目标分别给出的方式都需要重新编程
对面向对象的语言而言,对不同的目标,只需要调用不通的对象来实现这个目标
面向对象主要是为了写出通用性更强的代码,屏蔽差异
在代码中描述一个对象
方式是描述这个对象的属性和方法
举个例子
对于一台电脑,将其作为一个对象,那么它的
属性:
- 屏幕尺寸
- 内存大小
- 处理器性能
- ……
方法:
- 开机
- 关机
- 重启
- ……
在程序当中,类是一个对象的类型
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Test18
{
class Program
{
static void Main(string[] args)
{
Console.BackgroundColor = ConsoleColor.Green;
Console.ReadKey();
}
}
}
Console.BackgroundColor是Console类中的一个属性
Console.ReadKey()是Console类中的一个方法
7.2 类
//语法
[public] class 类名
{
字段
属性
方法
}
实际应用,新建一个Person类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Test18
{
public class Person
{
public string _name;
public int _age;
public char _gender;
public static void Action()
{
Console.WriteLine("生命在于运动");
}
}
}
对该类进行实际调用
namespace Test18
{
class Program
{
static void Main(string[] args)
{
Person zhangSan = new Person();
zhangSan._name = "张三";
zhangSan._age = 22;
zhangSan._gender = '男';
Console.WriteLine("我叫{0},我今年{1}岁,我是{2}生", zhangSan._name, zhangSan._age, zhangSan._gender);
zhangSan.Action();
}
}
}
类是不占用内存的,只有实例化一个对象时,才会占用内存
类的属性用于保护对象,对字段的赋值与取值进行限定
private string _name;
public string Name
{
get{ return _name; }
set{ _name = value; }
}
private int _age;
public int Age
{
get{ return _age; }
set{ _age = value; }
}
private char _gender;
public char Gender
{
get{ return _gender; }
set{ _gender = value; }
}
对字段的赋值在正常情况下应该通过属性实现,字段本身访问权限应该设置为私有那么在主方法中的调用应该使用属性中的get与set方法实现
zhangSan.Name = "张三";
zhangSan.Age = 22;
zhangSan.Gender = '男';
Console.WriteLine("我叫{0},我今年{1}岁,我是{2}生", zhangSan.Name, zhangSan.Age, zhangSan.Gender);
当我们对这个类中的_age字段赋值时,应该考虑到实际情况,人的年龄是大于0小于100的,所以在对属性Age的set方法中,需要对赋值进行判断
set
{
if(value<0||value>100)
{
value = 0;
}
_age = value;
}
对字段使用属性中的get方法时,也可以对其进行判断
get
{
if(_gender!='男'&&_gender!='女')
{
return _gender = '男';
}
return _gender;
}
7.3 静态与非静态
static关键字用于表示目标是否为静态
在非静态类中,既可以有非静态成员,也可以有静态成员
在调用非静态成员时,需要使用对象名.非静态成员名
在调用静态成员时,需要使用类名.静态成员名
静态类中只允许有静态成员,不允许出现非静态成员
微软提供的大部分常用的类都是静态类,可以直接通过类名.成员名的方式调用
静态类在整个项目中是资源共享的
在程序结束后,静态类才会释放资源
堆栈中的临时变量将在使用结束后释放资源
7.4 构造函数
构造函数的作用是帮助我们初始化对象,即给对象的每个属性依次赋值
- 构造函数不能有返回值,也不能写void
- 构造函数的名称必须和类名一致
- 构造函数可以重载,用来输入不同的参数
- 创建类时,会默认创建一个无参构造函数
- 当自己写了构造函数后,默认的无参构造函数会被替代
/// <summary>
/// 构造函数
/// </summary>
/// <param name="name">学生姓名</param>
/// <param name="age">学生年龄</param>
/// <param name="gender">学生性别</param>
/// <param name="idNumber">学生学号</param>
public Student(string name,int age,char gender,string idNumber)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
this.IdNumber = idNumber;
}
Student zhangsan = new Student("张三", 18, '男',"88888888");
7.5 this关键字
this可以代指当前类的一个对象
在类当中显示调用本类的构造函数
public Student(string name, int age,char gender) : this(name, age, gender, "88888888") { }
public Student(string name, int age) : this(name, age, '男', "88888888") { }
public Student(string name) : this(name, 0, '男', "88888888") { }
7.6 析构函数
析构函数会在程序结束时执行
析构函数的主要作用是帮助我们释放资源
在.Net平台上,引入了GC,会自动帮我们释放资源
~Student() { } //析构函数会在程序结束时执行