方法(成员函数)
在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
{
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
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)
评论