C# - 构造方法重载与调用,析构方法(*) 068
构造方法重载
普通方法构成重载的规则:方法名称一样,对应位置参数的类型或个数不同可以构成方法重载而构造方法的构成规则与此一样
注意事项:如果方法的访问修饰符是private(还有其他的访问修饰符之后再说),在外部无论是普通方法还是构造方法都显示没有该方法的重载(该重载方法只能在类内部使用)
一旦定义了构造方法的重载,在创建新对象时就可以在访问在外部能访问的此类的所有构造方法的重载
//还是之前的学生类的示例
class Student //定义一个学生类
{
//添加一个无参数的构造方法
public Student()
{ }
//重载1
//对应位置参数个数不同
public Student(string name, char gender, string sname)
{
//为各个属性通过构造方法赋值
//this代表当前对象
this.SName = name;
this.SCname = sname;
this.SGender = gender;
}
//重载2
//对应位置参数类型不同
public Student(string name, string sname, char gender)
{
this.SName = name;
this.SCname = sname;
this.SGender = gender;
}
//重载3 只能在类内部使用
//定义为私有的构造方法
//外部创建对象时没有该方法的重载
private Student(string name, string sname)
{
this.SName = name;
this.SCname = sname;
//直接在构造方法内部赋值
this.SGender = '男';
}
}
重载的构造方法间的调用
之前说过构造方法可以调用普通方法,普通方法无法调用构造方法,但是构造方法间可以相互调用
调用方式:通过构造方法名()冒号加this(参数列表)的方式调用其他的重载方法
调用类型: 1)调用重载的构造方法 2)调用重载方法的参数
1)调用重载方法
//定义一个教师类
class Teacher
{
//定义字段与属性
private string tName;
public string TName
{
get { return tName; }
set { tName = value; }
}
private char tGender;
public char TGender
{
get { return tGender; }
set { tGender = value; }
}
private int tAge;
public int TAge
{
get { return tAge; }
set { tAge = value; }
}
//定义构造方法 1号
public Teacher(string name, char gender, int age)
: this(name, gender)//调用重载1
{
Console.WriteLine("调用三个参数的构造方法");
}
//重载1 2号
public Teacher(string name, char gender)
{
Console.WriteLine("调用两个参数的构造方法");
}
//重载2 3号
public Teacher(string name)
{
Console.WriteLine("调用一个参数的构造方法");
}
}
class Program //程序默认添加的程序类
{
static void Main(string[] args)
{
Teacher tc1 = new Teacher("张桂梅", '女',65);
//创建对象时首先调用1号,在调用1号时调用2号,
//调用2号时又调用了3号
//执行时,首先执行3号中的代码,然后执行2号中的代码
//最后执行1号的中执行
Teacher tc2 = new Teacher("张桂梅", '女');
//只会调用2号与3号,调用顺序是2号一>3号
//执行顺序是 3号一>2号
Teacher tc3 = new Teacher("张桂梅");
//只会调用3号
//三者调用顺序只能是由参数多的调用参数少的
//自己测试参数个数相同,对应位置类型不同的构造方法
//1号可以调用 2与3号
//2号可以调用3号,不能调用1号
//3号只有自己
Console.ReadKey();
}
}
注意事项:构造方法只能调用一次另一个构造方法并且是调用比自己参数少的
2)调用构造方法的参数
//3个构造方法的重载
//1号
public Teacher(string name, char gender, int age)
: this(name, gender)
//此构造方法中的参数名称与this里面的参数名必须一样
//下面2号中参数名可以与此构造方法和this中的参数名不一样
//此时构造方法和this中的参数可以当做是"实参"
//2号中的参数名可以当做是"形参"
//之前说过实参与形参可以一样也可以不一样
{
//为属性赋值
//this.TName = name;//通过3号赋值
//this.TGender = gender;//通过2号赋值
this.TAge = age;//只能通过自己赋值
}
//2号
public Teacher(string name1, char gender)
: this(name1)
//构造方法中的name1与this中的name1可以不一样
//name1的值由1号构造方法中name的值传递过来
//与1号 相当于实参与形参名不一样
{
//this.TName=name1;//通过3号赋值
this.TGender = gender;
}
//3号
public Teacher(string name1)
{
//与2号 相当于实参与形参名一样
//只有一个参数,只能自己赋值
this.TName = name1;
}
//在创建对象调用构造方法时
//上面说过三种构造方法的重载调用顺序
//在1号中前两个属性的赋值可以通过
//调用的2号与2号调用3号中赋值对
//前两个属性进行赋值
//因此1号中前两个可以不用赋值
//2号在第一个属性可以通过调用3号中进行赋值
//因此2号中也可以省略第一个参数的赋值
//对有许多参数的构造方法非常有用
//如非特别要求可以使用此方式
//如果怕容易混淆,就各赋各的
//普通方法
public void SayHi()
{
Console.WriteLine("励志 {0}校长:{1},也是一位优秀的 {0}\"教师\",今年马上{2}岁了", TGender, tName,tAge);
}
//Main方法中创建对象,调用其构造方法与普通方法
static void Main(string[] args)
{
Teacher tc1 = new Teacher("张桂梅", '女', 66);
tc1.SayHi();
//调用1号构造方法时,
//会将第一个参数的值传递给3号
//将第二个参数传递给2号
//第三个参数值通过自己内部赋值
Console.WriteLine("");
Teacher tc2 = new Teacher("张桂梅", '女');
tc2.SayHi();
//调用2号构造方法时
//将第一个参数的值传递给3号
//第二个参数通过自己内部赋值
Console.WriteLine("");
Teacher tc3 = new Teacher("张桂梅");
tc3.SayHi();
Console.ReadKey();
}
析构方法(*)
析构方法了解为主,以前C++语言需要使用此方法"手动"释放资源(就是释放所占用的内存)此"手动"指编写在析构方法中的代码,运行时还是自动调用
析构方法是在释放非托管资源(包括之后说的文件流,数据库的连接等)时使用的(托管资源由C#中垃圾回收机制不定时进行释放资源);如非必要此方法基本不用
析构方法的语法格式
~析构方法名() //必须与类名相同
{
编写需要释放资源的代码
}
注意事项:
1)析构方法既没有访问修饰符,也没有参数,因此一个类只能有一个析构方法
3)析构方法没有重载(也不能继承)
4)只能定义在类中,不能定义在结构中,因此结构中没有析构方法
5)与构造方法一样没有被手动调用,只有自动调用
class Teacher
{
//析构方法
~Teacher()
{
Console.WriteLine("此对象所占资源(就是程序所占的内存)通过析构方法释放了");
Console.ReadKey();
//按回车健即可执行析构方法
}
}
static void Main(string[] args)
{
Teacher tc1 = new Teacher("张桂梅", '女', 66);
tc1.SayHi();
Console.ReadKey();
}