例子:
static void Main() { Doctor dc=new Doctor(); dc.Name="李四"; dc.Age=25; Doctor dc2=new Doctor("张三",35); Console.WriteLine(dc.Name); Console.WriteLine(dc.Age); Console.WriteLine(dc2.Name); Console.WriteLine(dc2.Age); Console.WriteLine(dc.doSth()); Console.WriteLine(Doctor.doAnth()); } } }
Doctor dc = new Doctor()用来实例化一个Doctor类,产生了一个新医生。与类同名的叫构造函数,是用来初始化类的,在每个类实例化的时候会自动调用。
1.值传递和引用传递
using System; namespace gosoa.com.cn { public class OneDoctor { static void FunctionTest(int [] arr, int x) { arr[0]=100; x=10; } static void Main() { int [] arrTemp={0,1,2,3,4}; int y=30; Console.WriteLine(arrTemp[0]); Console.WriteLine(y); FunctionTest(arrTemp, y); Console.WriteLine(arrTemp[0]); Console.WriteLine(y); } } }
输出0,30,100,30。因为数组是引用类型,在调用方法前后,引用类型的修改会保留下来,而值类型的修改不会保留下来。
2.ref参数
ref关键字是强迫参数通过引用传递。
我们把 上例中的方法修改为 static void FunctionTest(int [] arr, ref int x) 这样,调用的时 候
也加上 ref 即:functionTest(arrTemp, ref y); 执行后的结果就是 0,30,100,10。
注意:在调用有 ref参数的方法时,必须将参数要传递的参数提前初始化。但在调用 out参
数的方法时 ,就不必提前初始化。
3.out参数
输出参数不创建新的存储位置,而是使用其基础变量的存储位置。
4.参数数组
必须为一维数组,且必须为方法的最后一个参数,不能同时和ref或out一直使用。
5.方法的重载
重载:方法名相同,但参数类型和参数个数不能完全相同。
静态方法是类的方法,静态方法从类一创建好就存在。而实例方法是对象的方法,只能通过对象去调用。
虚方法是为了实现基类可以调用派生类的方法,若派生类没有重写虚方法,将使用基类的虚方法。虚方法用virtual修饰,虚方法在派生类中的实现叫重写方法。非虚方法不能重写。
namespace 示例chapter8 { public class Program { public virtual void P1 () //虚方法P1 { Console.WriteLine("Program.P1"); //显示“Program.P1”字符串 } public void P2() //非虚方法P2 { Console.WriteLine("Program.P2"); //显示“Program.P2”字符串 } } public class Test: Program { public override void P1() //重写了Program类的虚方法P1 { Console.WriteLine("Test.P1"); //显示“Test.P1”字符串 } public void P2() //非虚方法P2 { Console.WriteLine("Test.P2"); //显示“Test.P2”字符串 } } public class T { static void Main() { Test t = new Test(); Program p = new Program(); Program program; //声明一个基类的指针变量 program = p; program.P1(); //调用基类的P1方法 program = t; program.P1(); //调用了继承类的方法P1() program.P2(); //调用了基类的非虚方法P2() Console.ReadLine(); } } }
密封方法不能被派生类重写,用sealed修饰,在声明密封方法时,也必须添加override修饰符。
当实例方法声明包含abstract修饰符时,称该方法为抽象方法。抽象方法只能创建在抽象类中,且默认为虚方法,但在声明抽象方法时,不能使用virtual修饰符。
是一种特殊的属性,用this关键字指定。索引器始终是实例成员,不能用static修饰,必须通过索引来访问其元素。
public class Program { private string[] list; //元素类型为string的数组 public string this[int index] //声明索引器,索引为int类型 { get { return list[index]; } //获取list数组中的元素 set { if (index > -1 && index < list.Length) list[index] = value; //设置list数组中的元素的值 } } public Program(int count) //构造函数 { list = new string[count]; //为list数组分配内存 for (int i = 0; i < count; i++) //为list数组的每一个元素赋值 { list[i] = i.ToString(); } } static void Main() { int count = 100; Program p = new Program(count); for (int i = 0; i < count; i++) { //通过索引器访问p实例的list数组的元素,并显示在控制台 Console.Write(p[i] + " "); if (i % 10 == 0) Console.WriteLine(); } Console.ReadLine(); } }
Main方法里通过访问实例p加下标来访问索引器的元素。
注意:虽然索引器和数组比较相似,但是索引器不属于变量,其元素不能作为ref或out参数传递。