方法(成员函数) 在C#中,数据和操作均封装在类中,数据是以成员变量的形式出现,而对数据的操作主要体现在方法的使用上。在类中,方法的一般格式为: [方法修饰符] 返回值类型 方法名([参数列表]){方法体} [方法修饰符] 默认为internal Person类中定义了方法:public void Display(){} 实现从控制台输出人的姓名、性别和年龄。 C#方法(函数)的参数有四种类型:值参数、引用参数、输出参数和参数数组。 未用任何修饰符声明的参数为值参数。值参数在调用该参数所属的函数成员(方法、实例构造函数、访问器和运算符)时创建,并用调用中给定的实参值初始化。当从该函数返回时值参数被销毁。对值参数的修改不会影响到原自变量。值参数通过复制原自变量的值来初始化。 以下实例演示了四种参数传递方式。 using System; namespace Exam2_3 { class Class1 { static void Swap(int a,int b)//a,b为值参数 { int t; t=a;a=b;b=t; } static void Swap1(ref int a,ref int b)//a,b为引用参数 { int t; t=a;a=b;b=t; } static void OutMultiValue(int a,out int b)//不为输出参数 { b=a*a; } static void MutiParams(params int []a)//a为参数数组 { for(int i=0;i<a.Length;i++) { Console.WriteLine("a[{0}]={1}",i,a[i]); } } static void Main(string[] args) { int x=10,y=20; int []b={10,20,30}; int v; Swap(x,y); Console.WriteLine("x={0},y={1}",x,y); Swap1(ref x,ref y); Console.WriteLine("x={0},y={1}",x,y); OutMultiValue(10,out v); Console.WriteLine("v={0}",v); MutiParams(b); Console.ReadKey(); } } } 结果分析: <1>. Swap(x,y)执行后x,y的值并未改变: 未用任何修饰符声明的参数为值参数。值参数在调用该参数所属的函数成员(方法、实例构造函数、访问器和运算符)时创建,并用调用中给定的实参值初始化。当从该函数返回时值参数被销毁。对值参数的修改不会影响到原自变量。值参数通过复制原自变量的值来初始化。 <2>. Swap1(ref x,ref y)执行后x,y的值交换: 用ref修饰符声明的参数为引用参数。引用参数就是调用者提供的自变量的别名。引用参数并不定义自的变量,而是直接引用原自变量,因此对引用参数的修改就将直接影响相应自变量的值。在函数调用中,引用参数必须被赋初值。这里的ref相当于C/C++中的应用符号“&”. <3>. OutMultiValue(10,out v); 用out修饰符定义的参数称为输出参数。如果希望函数返回多个值,可使用输出参数。输出参数与引用参数类似,它并不定义自己的变量,而是直接引用原变量,这样当在函数内为输出参数赋值时,就相当于给原自变量赋值。与引用参数的差别在于:输出参数在调用方法前无需对变量进行初始化。 这里的out类似于return. <4>. MutiParams(b); 用params修饰符声明的变量称为参数数组,它允许向函数传递个数变化的参数。在方法的参数类表中只允许出现一个参数数组,而且在方法同时具有固定参数和参数数组的情况下,参数数组必须放在整个参数列表的最后,同时参数数组只允许是一维数组。不能将params修饰符与ref和out修饰符组合起来使用。这里params相当于C/C++中的指标(pointer)。 属性 属性是一种类成员,它是对现实世界中实体特征的抽象,它提供了一种对类或对象特征进行访问的机制。例如:字体、颜色、标题等都可以作为属性。属性所描述的是状态信息,在类的某个实例中,属性的值表示该对象相应的状态值。与域相比,属性具有良好的封装性。属性不允许直接操作数据内容,而是通过访问器进行访问。这种机制可以把读取和写入对象的某些特性与一些操作关联起来;甚至,它们还可以对此特性进行计算。 定义属性的格式如下: 访问修饰符 属性类型 属性名 { get { } set { } } 其中get、set分别定义了属性所描述的域的读、写属性。 using System; class Window{ private double m_width=30; public double Width{ get { return m_width; } set { m_width=value; } } public static void Main() { Window w = new Window(); w.Width=20; Console.WriteLine(“The width of window is {0}.”,w.Width); Console.ReadKey(); } } 结果分析: w.Width=20,属性Width调用set访问器给对象w的域m_width赋值。w.Width则调用 get访问器访问对象w的域m_width的值。 可以说,属性是一种特殊的方法,但属性和方法也有不同之处,主要有: (1)属性不必使用圆括号,但方法一定使用圆括号。 (2)属性不能制定参数,方法可以指定参数。 (3)属性不能使用void类型,方法则可以使用void类型。 (To be continued)

评论