为了使程序更加清晰,方便使用,使用面向对象编程
类实际上就是对象的模板,每个对象都含有数据,并提供了处理和访问数据的方法
类定义了类的每个对象(称为实例)可以包含什么数据和功能,主要包含数据成员和函数成员
数据成员:字段,
函数成员:方法
代码示例:首先在项目下创建一个类,命名为Customer,包含三个字段及一个函数,在main函数下调用
Customer.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _类 { class Customer { //定义四个字段,数据成员 public string name; public string address; public int age; public string buytime; //定义一个方法,函数成员 public void Show() { Console.WriteLine("客户姓名:"+ name); Console.WriteLine("客户地址:"+ address); Console.WriteLine("客户年龄:{0}", age); Console.WriteLine("购买时间:{0}", buytime); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _类 { class Program { static void Main(string[] args) { //因为在同一个项目之下,可以直接使用,如果不在需要引入命名空间 //1.创建声明一个对象, Customer customer1; //2.对象初始化,不初始化无法使用,使用new关键字进行初始化 customer1 = new Customer(); customer1.name = "siki"; Console.WriteLine(customer1.name); //使用对象中的方法 customer1.Show(); //控制台暂停 Console.ReadKey(); } } }
运行结果
练习一:
定义一个车辆(Vehicle)类,具有run、stop俩个方法,具有speed、maxspeed。weight字段
答:
在项目中新建类文件,命名为Vehicle.cs
Vehicle.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _类的定义与声明 { //新建一个车辆类 class Vehicle { public float speed; public float maxSpace; public float weight; //新建方法run public void Run() { Console.WriteLine("车辆正在以{0}m/s速度前行", speed); } //新建方法stop public void Stop() { speed = 0; Console.WriteLine("车辆停止"); } } }
在Program.cs的main中进行赋值调用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _005_类的定义与声明 { class Program { static void Main(string[] args) { //类的实例及初始化,car1为实例 Vehicle car1 = new Vehicle(); //将车辆速度赋值100 car1.speed = 100; //调用 Vehicle类的run方法 car1.Run(); //调用 Vehicle类的stop方法 car1.Stop(); Console.WriteLine("当前车辆速度为:"+car1.speed); Console.ReadKey(); } } }
运行结果
练习二:
定义一个向量,ThreeVector,包含想,x,y,z三个字段,并且有计算长度的方法,有设置属性(set)的方法
使用这个变量声明一个变量(对象)
答:
新建一个ThreeVector的类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _类的定义与声明 { class ThreeVector { //新建x,y,z字段 public float x; public float y; public float z; //新建长短计算方法Length //注意函数前,类型格式为float,不为void,有返回值 public float Length() { //根据xyz计算长度,并返回 return (float)Math.Sqrt(x * x + y * y + z * z); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _类的定义与声明 { class Program { static void Main(string[] args) { //类的实例及初始化,vector1为实例 ThreeVector vector1 = new ThreeVector(); //赋值 vector1.x = 1; vector1.y = 1; vector1.z = 1; Console.WriteLine("当前向量长度为:{0}", vector1.Length()) ; Console.ReadKey(); } } }
运行结果
编程规范上,将类中的字段设置为private,只可以在类的内部进行方法,不可以进行访问,上述在main函数中就无法进行赋值
为字段提供修改犯法,进行修改,代码如下
ThreeVector.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _类的定义与声明 { class ThreeVector { //新建x,y,z字段 private float x; private float y; private float z; //为字段设置set方法,来设置字段的值 //如果我么直接在方法内部访问同名变量,优先访问最近形参 //使用this关键字,可以将变量确定为当前类中,而不会造成歧义 public void SetX(float x) { this.x = x; } public void SetY(float y) { this.y = y; } public void SetZ(float z) { this.z = z; } public float Length() { //根据xyz计算长度,并返回 return (float)Math.Sqrt(x * x + y * y + z * z); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _类的定义与声明 { class Program { static void Main(string[] args) { //类的实例及初始化,vector1为实例 ThreeVector vector1 = new ThreeVector(); //赋值 //vector1.x = 1; //vector1.y = 1; //vector1.z = 1; //通过set方法进行赋值 vector1.SetX(2); vector1.SetY(2); vector1.SetZ(2); Console.WriteLine("当前向量长度为:{0}", vector1.Length()) ; Console.ReadKey(); } } }
运行结果
当我们构造对象的时候,对象的初始化,是自动完成的,但是扎起初始化对象的过程中有点时候,并不希望回到默认的系统值
构造函数就是用于初始化数据的函数
声明基本的构造函数的语法就是声明一个和所在类同名的方法,但是没有返回类型
例如上面中ThreeVector类,可以加入一个public ThreeVector()函数
ThreeVector.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _类的定义与声明 { class ThreeVector { //建造一个构造函数,用来进行初始化 //构造函数可以带有参数,也可以不带参数 public ThreeVector(float x, float y, float z) { Console.WriteLine("构造函数被调用了,原始构造函数被停用"); //初始化x,y,z this.x = x; this.y = y; this.z = z; } public float Length() { //根据xyz计算长度,并返回 return (float)Math.Sqrt(x * x + y * y + z * z); } } }
Main.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _005_类的定义与声明 { class Program { static void Main(string[] args) { ThreeVector vector1 = new ThreeVector(3,3,3); Console.WriteLine("当前向量长度为:{0}", vector1.Length()) ; Console.ReadKey(); } } }
属性和字段不太一样,包含两个模块set,get
访问属性和访问字段一样,当取得会调用get,设置数据的时候调用set
ThreeVector.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _005_类的定义与声明 { class ThreeVector { //新建一个属性 public int MyintProperty { //需要一个get set { //用来赋值 // Console.WriteLine("属性中的set块被调用"); Console.WriteLine("set的value的数值"+value); } //需要一个set get { //用来设置返回值 Console.WriteLine("属性中的get块被调用"); return 100; } //需要一个set } } }
Main.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _类的定义与声明 { class Program { static void Main(string[] args) { //使用属性和使用字段一样 //实例初始化 ThreeVector vector1 = new ThreeVector(); //赋值操作 vector1.MyintProperty = 0; //取值操作 int temp = vector1.MyintProperty; Console.WriteLine("temp:{0}", temp); Console.ReadKey(); } } }
属性的set和get可以任意存在一个,不是必须同时存在
如果没有get就无法取值,set没有就没法赋值
1.通过属性来访问字段
ThreeVector.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _005_类的定义与声明 { class ThreeVector { //新建私有x,y,z字段 private float x; private float y; private float z; //设置属性,通过属性来访问字段,也可以叫做get,set方法 public float X { get { return x; } set { x = value; } } } }
Main.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _005_类的定义与声明 { class Program { static void Main(string[] args) { ThreeVector vector1 = new ThreeVector(); vector1.X = 100; Console.WriteLine("X:{0}", vector1.X); Console.ReadKey(); } } }
2.属性的简写形式
//编译器会自动给我提供一个字段来存储,效果和上面是一样的 public float X { get; set; }