类
前言: 对于类的理解这个太熟悉不过了,从入门的第一个程序HelloWord,中第一句代码就是[访问权限] Class 类名{…},可以看出类无处不在,如果把项目比作房子,那么类可以说就是这个房子的每一块砖瓦,而程序员就是这个添砖加瓦的人,类是自己定义数据类型的蓝图,规定该类对象执行什么操作,存放什么数据类型,所以它十分重要,犹如你的内裤一般,所以请不要随便偷看别人的类库。
一:定义
1:语法
[访问权限] Class 类名
{
//你的美好蓝图
}
例:
public class Program
{
static void Main(string[] args)
{
Console.WriteLine("你的美好南图!");
Console.ReadLine();
}
}
运行结果:
2:访问权限
备注:访问权限就是访问资源时,对访问者划分权限范围(访问该类或该成员变量或该函数),类的默认访问标识符是 internal,成员的默认访问标识符是 private。比如一个访问权限为private的变量,这个变量只有自身类部可以进行访问其他都无访问权限。
二:构造函数
1:无参构造函数
2:有参构造函数
例:
public class student
{
private string name;
private int age;
//重写无参构造函数
public student()
{
Console.WriteLine("你调用了无参构造函数");
}
//有参构造函数
public student(string name,int age)
{
this.name = name;
this.age = age;
Console.WriteLine("你调用了有参构造函数");
Info();
}
public void Info()
{
Console.WriteLine($"你的名字:{name},你今年:{age}岁了");
}
}
public class Program
{
static void Main(string[]args)
{
//无参构造函数
student stu = new student();
//有参构造函数
student stu2 = new student("张三",20);
Console.ReadLine();
}
}
运行结果:
备注:无参构造函数是系统自己生成定义的,用户可以重写,构造函数的作用起到初始化类的作用,从有参构造函数就可以看出,用户在其他类传递的参数,通过this就可以直接赋值给成员变量,从而起到初始化类的作用。
三:析构函数
~类名()
{
//一些要释放的代码
}
class Line
{
private double length; // 线条的长度
public Line() // 构造函数
{
Console.WriteLine("对象已创建");
}
~Line() //析构函数
{
Console.WriteLine("对象已删除");
Console.ReadLine();
}
public void setLength(double len)
{
length = len;
}
public double getLength()
{
return length;
}
static void Main(string[] args)
{
Line line = new Line();
// 设置线条长度
line.setLength(6.0);
Console.WriteLine("线条的长度: {0}", line.getLength());
}
}
运行结果:
备注:析构函数,用来做善后工作,手动释放资源,但是只能在类中使用,系统自己调用,但是不能重写,继承,不能被调用,不能带修饰或参数。
四:封装(成员变量 ,成员函数 ,静态关键字:Static,get和set方法)
1:成员变量
①:字段(成员变量):定义的一条数据属性,数据类型可以是值类型也可以是引用类型。(比如:人的身高,体重,年龄等等都可以说成是字段,包括人这个对象也可以看作是一条字段)
②:语法:
[访问权限] [Static] 数据类型 变量名;
([]表示选填,成员变量默认访问权限为Private)
③:例
//声明String类型,变量名为briefs,默认值为"内裤"的成员变量
public string briefs = "内裤";
2成员函数
把一些相关的语句组织在一起,用来执行一个任务的语句块。
语法:
[访问权限][...] [Static] 返回数据类型T 方法名([形参数据类1 形参名1],[形参数据类2 形参名2]..){
//[]表示选填,成员默认访问权限为Private
return T;//返回值类型要和返回数据类型一一对应;无返回值类型可无需返回void
}
public class Program
{
public void meath()
{
Console.WriteLine("定义一个返回数据类型为无返回值类型,无形式参数的方法");
}
public int Add(int a,int b)
{
return a + b;
}
}
public class tset
{
static void Main(string[] args)
{
Program pro = new Program();
pro.meath();
Console.WriteLine($"20+20={ pro.Add(20, 20)}");
Console.ReadLine();
}
}
运行结果:
3:静态关键字:Static
Static静态修饰表示直接访问该变量,该方法,把修饰为Static的变量看作常量来使用,在访问其他类的资源时,无需实例化类。
public class Program
{
//声明String类型,变量名为briefs,默认值为"内裤"的成员变量
public static string briefs = "内裤";
//声明一个返回值为String类型,方法名为GetBriefs的方法
public static String GetBriefs()
{
return $"我给儿子买了一条{briefs}";
}
}
public class ProgramSon
{
static void Main(string[] args)
{
//无需实例化直接调用
Console.WriteLine(Program.briefs);
Console.WriteLine(Program.GetBriefs());
Console.ReadLine();
}
}
运行结果:
4:get和set方法
①:添加get和set方法的快捷键
选中属性,按ctrl+r+e点弹出窗体确定就可以
②:派生属性:(可以在里面设置相应的条件)
//私有属性
private string name;
private int age;
//公开访问
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
public int Age
{
get
{
return age;
}
set
{
if(age>0&&age<200)
{
age = value;
}else
{
age = 0;
Console.WriteLine("年龄不符合要求");
}
}
}
//只读,只写
//私有属性
private string name;
private int age;
//公开访问
//只读,无法修改,只能读取
public string Name
{
get
{
return name;
}
}
//只写,无法读取,只能修改
public int Age
{
set
{
if(age>0&&age<200)
{
age = value;
}else
{
age = 0;
Console.WriteLine("年龄不符合要求");
}
}
}
//只读
//只写
③另一种写法不能设置相应的条件(三层架构中常用此属性作实体类)
Public string name { set; get; }
Public int age { set; get; }
//只写
public string name { set; private get; }
//只读
public int age { private set; get; }
备注:封装就是对类进行设计,就访问类型来看,成员变量常为私有属性(默认Private),用户要对成员变量进行访问,常常通过get和set访问器进行访问(私有属性,公开访问),外部初始化本类,通过类的构造函数进行类初始化,类中成员函数表示一系列操作的集合,用来实现具体操作,如果一个成员变量一个成员函数常常被外部使用,就像常量一样的进行访问,常常定义为static。