引言:类是c#的核心内容之一,当我们把所有的方面都分成一类又一类时,我们只需要在主程序中调用各个类的方法便可以轻易实现很多复杂的功能,面向对象编程是绝对离不开类的。类与结构有着差不多的结构和用法,本博文重点介绍类的使用,最后粗略介绍结构的特有用法。
4.1 方法
(1)方法的声明
[modifiers] return_type MethodName([parameters])
{
//MethdBody
}
modifiers是指方法的可访问性,return_type是指返回值的类型,MethodName是方法名,parameters时方法的参数,以及最后的方法体。尤其注意,如果方法有返回值,return语句就必须与返回值一起使用。如果方法没有返回值,就可以把返回的类型指定为void。
(2)方法的调用
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace 方法声明与调用 7 { 8 class MathTry 9 {10 11 public int value;12 public int GetSquare()//非静态不带参数方法13 {14 return value * value;15 16 }17 18 public static int GetSquareOf(int x)//静态带参数方法19 {20 return x * x;21 22 }23 public static double GetPi()//静态不带参数方法24 {25 return 3.1415926;26 27 }28 public double GetSquareOf(double x)//非静态带参数方法29 {30 return x * x;31 32 }33 34 }35 class Program36 {37 38 static void Main(string[] args)39 {40 //下面调用静态方法:静态方法可以使用类名直接调用!41 Console.WriteLine("Pi is:"+MathTry.GetPi());42 Console.WriteLine("Square of 5 is:"+MathTry.GetSquareOf(5));43 //下面引用非静态方法,首先需要实例化类:44 MathTry math = new MathTry();45 math.value = 10;46 Console.WriteLine("The Squre is:"+math.GetSquare());47 Console.WriteLine("Square of 20.0 is:" + math.GetSquareOf(20.0));48 49 }50 }51 }
尤其注意静态方法的调用,不需要实例化对象。
(3)传递参数
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace 方法参数传递 7 { 8 class ParameterTest 9 {10 public static void SomeFuction(int[] ints,int i)11 {12 13 ints[0] = 100;14 i = 100;15 16 17 }18 public static void SomeFuction(string j)19 {20 21 22 j = "sharp也疯狂!";23 24 25 }26 27 28 }29 30 31 32 class Program33 {34 static void Main(string[] args)35 {36 int i = 0;37 int[] ints = { 0,1,2,4,8};38 string j = "sharp";39 Console.WriteLine("在没有传递参数之前:");40 Console.WriteLine("i="+i);41 Console.WriteLine("ints[0]="+ints[0]);42 Console.WriteLine("j=" + j);43 Console.WriteLine("在传递参数之后:");44 ParameterTest.SomeFuction(ints,i);45 Console.WriteLine("i=" + i);46 Console.WriteLine("ints[0]=" + ints[0]);47 ParameterTest.SomeFuction(j);48 Console.WriteLine("j=" + j);49 }//以上代码说明,值类型传递之后,立即覆盖方法本身的自己的值,而引用型则会继续保持方法体自己的值,但是string这个引用型是个特例,其特点遵循值的引用。50 }51 }
值得注意的是,如果在方法的参数中添加ref关键字,可以迫使参数通过引用传递给方法,调用时也需要ref关键字,那么该方法对变量所做的任何改变都会影响原始对象的值。将上述代码的int i前加上ref关键字以及最后的调用也添加上ref关键字后,运行结果如下图所示:
还有一种情况是out关键字的用法,它可以避免c#所坚持的输入参数的初始化,在方法的输入参数前加上out关键字可以避免传递给该方法的变量的初始化,out关键字也是以强制引用型的转化。将以上代码的ref关键字改为out关键字后,其输出结果和上图一样。
c#支持方法重载,但是需要注意的是:1.两个方法不能仅在返回类型上有区别;2.两个方法不能仅仅根据参数声明为ref还是out来区分。
4.2 构造函数
声明构造函数就是声明一个与包含的类的同名的没有返回类型的方法。如果没有编写构造函数,那么编译器会创建一个默认的构造函数,而这个构造函数仅仅用来把所有的成员字段初始化为标准的默认值,如果编写了带参数的构造函数,编译器便会调用用户自己编写的构造函数而不会创建默认的构造函数,构造函数根据参数的不同,可以有不同的重载。
主要介绍:静态构造函数
静态构造函数只执行一次,主要用于初始化静态字段和属性,静态构造函数不带任何参数并且只能访问静态成员。
1 using System; 2 using System.Drawing; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 7 namespace 静态构造函数 8 { 9 public class UserPreferences10 {11 public static readonly Color BackColor;12 static UserPreferences()13 {14 DateTime now = DateTime.Now;15 if (now.DayOfWeek == DayOfWeek.Saturday || now.DayOfWeek == DayOfWeek.Sunday)16 17 BackColor = Color.Green;18 else19 BackColor = Color.Red;20 21 }22 23 24 25 26 27 }28 29 30 class Program31 {32 static void Main(string[] args)33 {34 Console.WriteLine("The color is :"+UserPreferences.BackColor.ToString());35 }36 }37 }
4.3 只读字段
常量不能修改,为此诞生了只读字段,只读字段使用关键字readonly声明。可以在构造函数中给只读字段赋值。
结构:
结构使用关键字struct声明,替代了class。大部分结构上结构与类相同,但是需要注意一下几点:
- 结构是值类型
- 结构不支持继承
- 结构的构造函数的工作方式有区别,编译器总是提供一个无参数的默认构造函数,并且不能被替换
- 使用结构可以指定字段如何在内存中布局