构造函数与析构函数
构造函数
- 构造函数是类的特殊方法成员,其名称和类名相同,主要用来完成对象的初始化。
- C#通过new创建对象的过程实际上就是调用类的构造函数的过程,创建对象时调用构造函数对对象进行初始化。
- 每个类都有构造函数,如果没有定义,系统也会提供一个默认的构造函数,默认的构造函数一般不进行什么操作。
- 在访问一个类的时候,系统最先执行构造函数中的语句。
- 声明的构造函数是非静态的实例构造函数。构造函数也有静态的,静态构造函数用于初始化类中的静态字段成员。
析构函数
- 析构函数是对象销毁前释放所占用系统资源的类的成员。
- 析构函数的名字是在类名前面加一个符号“~”。析构函数不接受任何参数,也不返回任何值。
- 一个类只能有一个析构函数,析构函数不能手动调用,是系统自动调用的。
class Point{public int X { get; set; } // 定义属性X,得到和设置点的横坐标public int Y { get; set; } // 定义属性Y,得到和设置点的纵坐标public static int z;static Point() // 定义静态构造函数{z = 100;}public Point() // 无参构造函数用于初始化{X = 0; Y = 2; // 初始化}public Point(int val_x, int val_y) // 有参数构造函数{X = val_x; Y = val_y; // 用指定的参数初始化X和Y}~Point() // 析构函数{Console.WriteLine(\"析构函数主要用于清理资源!\");Console.ReadKey();}}
Main方法测试代码
Console.WriteLine(\"静态构造函数:\" + Point.z); // 静态构造函数:100Point objPoint1 = new Point();Console.WriteLine(\"无参构造函数演示\");Console.WriteLine(\"X = \" + objPoint1.X); // X = 0Console.WriteLine(\"Y = \" + objPoint1.Y); // Y = 2Point objPoint2 = new Point(80, 90);Console.WriteLine(\"有参构造函数演示\");Console.WriteLine(\"X = \" + objPoint2.X); // X = 80Console.WriteLine(\"Y = \" + objPoint2.Y); // Y = 90Console.ReadKey();
参数传递
- C#定义方法时声明的参数称为形参(或称虚拟参数),调用方法时传给形参的值称为实参。
- 参数传递类型有值传递与引用传递两种。值传递是C#默认的传递方式。
- 如果希望所调用的方法能更改实在参数的值,则必须使用ref或out关键字声明通过引用传递方式传递参数。
- 引用传递是把实在参数的地址传给形式参数,形式参数和实在参数指向同一个存储单元,对形式参数的改变就是对实在参数的改变。
- out传递与ref类似,二者的区别是,ref要求参数在传递之前必须初始化,out则不要求初始化。
值传递示例
// 定义值传递方法private void Swap(int num1, int num2) // 交换数据的方法{int temp; // 定义用于交换变量值得中间变量temp = num1; // 将num1值赋值给中间变量tempnum1 = num2; // 将num2赋值给num1num2 = temp; // 将中间变量存储的num1的值赋值给num2}
int num1 = 1;int num2 = 2;Console.WriteLine(\"此实例演示值传递参数\");Console.WriteLine(\"交换之前的字符串顺序为:num1-{0}, num2-{1}\", num1, num2); // 1 2Program objProgram = new Program();objProgram.Swap(num1, num2);Console.WriteLine(\"交换之后的字符串顺序为:num1-{0}, num2-{1}\", num1, num2); // 1 2Console.ReadKey();
运行结果显示并没有真正交换num1和num2两个变量的值,因为选择的是值传递的方法来传递参数。
ref引用传递示例
// 定义引用传递方法private void Swap(ref int num1, ref int num2) // 交换数据的方法{int temp; // 定义用于交换变量值得中间变量temp = num1; // 将num1值赋值给中间变量tempnum1 = num2; // 将num2赋值给num1num2 = temp; // 将中间变量存储的num1的值赋值给num2}
int num1 = 1;int num2 = 2;Console.WriteLine(\"此实例演示引用传递参数\");Console.WriteLine(\"交换之前的字符串顺序为:num1-{0}, num2-{1}\", num1, num2); // 1 2Program objProgram = new Program();objProgram.Swap(ref num1, ref num2);Console.WriteLine(\"交换之后的字符串顺序为:num1-{0}, num2-{1}\", num1, num2); // 2 1Console.ReadKey();
ref引用传递交换了两个变量的值,在使用ref方式传递参数时,定义和调用时都要使用ref关键字。
out引用传递
- out关键字与ref关键字类似,也是声明引用传递参数的,但ref要求变量必须在传递之前对实在参数初始化。
- 尽管作为out参数传递的变量不需要在传递之前初始化,但需要调用方法在方法返回之前对out传递的参数赋值。
- 当希望方法返回多个值时,可以使用out方式,使用out参数的方法可以将变量用做返回类型,还可以将一个或多个对象作为out参数返回给调用方法。
下面的例子使用out在一个方法调用中返回3个值。请注意,第3个参数所赋的值为null,这样能允许方法有选择地返回值。
namespace PointClass{class Program{static void Main(string[] args){int value;string str1, str2;Console.WriteLine(\"此实例演示out引用传递\");Method(out int value, out string str1, out string str2);Console.WriteLine(\"参数value的值是:\" + value); // 参数value的值是:44Console.WriteLine(\"参数str1的值是:\" + str1); // 参数str1的值是:I\'ve been returned!Console.WriteLine(\"参数str2的值是:\" + str2); // 参数str2的值是:Console.ReadKey();}static void Method(out int i, out string s1, out string s2) // 定义静态方法使用out进行参数的传递{i = 44;s1 = \"I\'ve been returned!\";s2 = null;}}}
- 点赞
- 收藏
- 分享
- 文章举报
Yeats.NeverGiveUp发布了12 篇原创文章 · 获赞 0 · 访问量 167私信关注