C#入门经典第三版(最新)(5)

2019-03-27 20:47

类的一个对象,在对象内创建一个该字段实例,创建它的对象被撤销,该字段对象也被撤销,实例字段采用如下方法引用:实例名.实例字段名。用const修饰符声明的字段为常量,常量只能在声明中初始化,以后不能再修改。用readonly修饰符声明的字段为只读字段,只读字段是特殊的实例字段,它只能在字段声明中或构造函数中重新赋值,在其它任何地方都不能改变只读字段的值。例子: public class Test

{ public const int intMax=int.MaxValue;//常量,必须赋初值 public int x=0;//实例字段

public readonly int y=0;//只读字段 public static int cnt=0;//静态字段 public Test(int x1,int y1)//构造函数 { //intMax=0;//错误,不能修改常量 x=x1;//在构造函数允许修改实例字段 y=y1;//在构造函数允许修改只读字段

cnt++;//每创建一个对象都调用构造函数,用此语句可以记录对象的个数 }

public void Modify(int x1,int y1) { //intMax=0;//错误,不能修改常量 x=x1; cnt=y1;

//y=10;//不允许修改只读字段 } }

class Class1

{ static void Main(string[] args) { Test T1=new Test(100,200);

T1.x=40;//引用实例字段采用方法:实例名.实例字段名

Test.cnt=0;//引用静态字段采用方法:类名.静态字段名 int z=T1.y;//引用只读字段 z=Test.intMax;//引用常量 } }

1.9.2 属性

C#语言支持组件编程,组件也是类,组件用属性、方法、事件描述。属性不是字段,但必然和类中的某个或某些字段相联系,属性定义了得到和修改相联系的字段的方法。C#中的属性更充分地体现了对象的封装性:不直接操作类的数据内容,而是通过访问器进行访问,借助于get和set方法对属性的值进行读写。访问属性值的语法形式和访问一个变量基本一样,使访问属性就象访问变量一样方便,符合习惯。

在类的基本概念一节中,定义一个描述个人情况的类Person,其中字段name和age是私有字段,记录姓名和年龄,外部通过公有方法SetName和SetAge修改这两个私有字段。现在用属性来描述姓名和年龄。例子如下: using System;

public class Person

{ private string P_name=\张三\是私有字段

private int P_age=12;//P_age是私有字段

public void Display()//类的方法声明,显示姓名和年龄

{ Console.WriteLine(\姓名:{0},年龄:{1}\ }

public string Name//定义属性Name { get

{ return P_name;} set

{ P_name=value;} }

public int Age//定义属性Age { get

{ return P_age;} set

{ P_age=value;} } }

public class Test

{ public static void Main()

{ Person OnePerson= new Person();

OnePerson.Name=\田七\田七\,通过set方法修改变量P_Name string s=OnePerson.Name;//通过get方法得到变量P_Name值

OnePerson.Age=20;//通过定义属性,既保证了姓名和年龄按指定方法修改 int x=OnePerson.Age;//语法形式和修改、得到一个变量基本一致,符合习惯 OnePerson.Display(); } }

在属性的访问声明中,只有set访问器表明属性的值只能进行设置而不能读出,只有get访问器表明属性的值是只读的不能改写,同时具有set访问器和get访问器表明属性的值的读写都是允许的。

虽然属性和字段的语法比较类似,但由于属性本质上是方法,因此不能把属性当做变量那样使用,也不能把属性作为引用型参数或输出参数来进行传递。 1.10 类的方法

方法是类中用于执行计算或其它行为的成员。所有方法都必须定义在类或结构中。 1.10.1 方法的声明 方法的声明格式如下:

属性 方法修饰符 返回类型 方法名(形参列表){方法体}

方法修饰符包括new、public、protected、internal、private、static、virtual、sealed、override、abstract和extern。这些修饰符有些已经介绍过,其它修饰符将逐一介绍。返回类型可以是任何合法的C#数据类型,也可以是void,即无返回值。形参列表的格式为:(形参类型 形参1,形参类型 形参2,...),可以有多个形参。不能使用C语言的形参格式。 1.10.2 方法参数的种类

C#语言的方法可以使用如下四种参数(请注意和参数类型的区别): ? 值参数,不含任何修饰符。

? 引用参数,以ref修饰符声明。 ? 输出参数,以out修饰符声明。 ? 数组参数,以params修饰符声明。 1. 值参数

当用值参数向方法传递参数时,程序给实参的值做一份拷贝,并且将此拷贝传递给该方法,被调用的方法不会修改实参的值,所以使用值参数时,可以保证实参的值是安全的。如果参数类型是引用类型,例如是类的引用变量,则拷贝中存储的也是对象的引用,所以拷贝和实参引用同一个对象,通过这个拷贝,可以修改实参所引用的对象中的数据成员。 2. 引用参数

有时在方法中,需要修改或得到方法外部的变量值,C语言用向方法传递实参指针来达到目的,C#语言用引用参数。当用引用参数向方法传递实参时,程序将把实参的引用,即实参在内存中的地址传递给方法,方法通过实参的引用,修改或得到方法外部的变量值。引用参数以ref修饰符声明。注意在使用前,实参变量要求必须被设置初始值。 3. 输出参数

为了把方法的运算结果保存到外部变量,因此需要知道外部变量的引用(地址)。输出参数用于向方法传递外部变量引用(地址),所以输出参数也是引用参数,与引用参数的差别在于调用方法前无需对变量进行初始化。在方法返回后,传递的变量被认为经过了初始化。值参数、引用参数和输出参数的使用见下例: using System;

class g{public int a=0;}//类定义 class Class1

{ public static void F1(ref char i)//引用参数 { i='b';}

public static void F2(char i)//值参数,参数类型为值类型 { i='d';}

public static void F3(out char i)//输出参数 { i='e';}

public static void F4(string s)//值参数,参数类型为字符串 { s=\

public static void F5(g gg)//值参数,参数类型为引用类型 { gg.a=20;}

public static void F6(ref string s)//引用参数,参数类型为字符串 { s=\

static void Main(string[] args) { char a='c';

string s1=\

F2(a);//值参数,不能修改外部的a

Console.WriteLine(a);//因a未被修改,显示c F1(ref a);//引用参数,函数修改外部的a的值 Console.WriteLine(a);//a被修改为b,显示b Char j;

F3(out j);//输出参数,结果输出到外部变量j Console.WriteLine(j);//显示e

F4(s1);//值参数,参数类型是字符串,s1为字符串引用变量

Console.WriteLine(s1);//显示:abc,字符串s1不被修改 g g1=new g();

F5(g1);//值参数,但实参是一个类引用类型变量

Console.WriteLine(g1.a.ToString());//显示:20,修改对象数据 F6(ref s1);//引用参数,参数类型是字符串,s1为字符串引用变量 Console.WriteLine(s1);//显示:xyz,字符串s1被修改 } }

4. 数组参数

数组参数使用params说明,如果形参表中包含了数组参数,那么它必须是参数表中最后一个参数,数组参数只允许是一维数组。比如string[]和string[][]类型都可以作为数组型参数。最后,数组型参数不能再有ref和out修饰符。见下例: using System; class Class1

{ static void F(params int[] args)//数组参数,有params说明

{ Console.Write(\ foreach (int i in args) Console.Write(\ Console.WriteLine(); }

static void Main(string[] args) { int[] a = {1,2,3};

F(a);//实参为数组类引用变量a

F(10, 20, 30, 40);//等价于F(new int[] {60,70,80,90}); F(new int[] {60,70,80,90});//实参为数组类引用 F();//等价于F(new int[] {});

F(new int[] {});//实参为数组类引用,数组无元素 } }

程序输出

Array contains 3 elements: 1 2 3

Array contains 4 elements: 10 20 30 40 Array contains 4 elements: 60,70,80,90 Array contains 0 elements: Array contains 0 elements:

方法的参数为数组时也可以不使用params,此种方法可以使用一维或多维数组,见下例: using System; class Class1

{ static void F(int[,] args)//值参数,参数类型为数组类引用变量,无params说明 { Console.Write(\ foreach (int i in args) Console.Write(\ Console.WriteLine(); }

static void Main(string[] args) { int[,] a = {{1,2,3},{4,5,6}}; F(a);//实参为数组类引用变量a

//F(10, 20, 30, 40);//此格式不能使用

F(new int[,] {{60,70},{80,90}});//实参为数组类引用 //F();//此格式不能使用

//F(new int[,] {});//此格式不能使用 } }

程序输出

Array contains 3 elements: 1 2 3 4 5 6 Array contains 4 elements: 60,70,80,90 1.10.3 静态方法和实例方法

用修饰符static声明的方法为静态方法,不用修饰符static声明的方法为实例方法。不管类生成或未生成对象,类的静态方法都可以被使用,使用格式为:类名.静态方法名。静态方法只能使用该静态方法所在类的静态数据成员和静态方法。这是因为使用静态方法时,该静态方法所在类可能还没有对象,即使有对象,由于用类名.静态方法名方式调用静态方法,静态方法没有this指针来存放对象的地址,无法判定应访问哪个对象的数据成员。在类创建对象后,实例方法才能被使用,使用格式为:对象名.实例方法名。实例方法可以使用该方法所在类的所有静态成员和实例成员。例子如下: using System;

public class UseMethod

{ private static int x=0;//静态字段 private int y=1;//实例字段

public static void StaticMethod()//静态方法 { x=10;//正确,静态方法访问静态数据成员 //y=20;//错误,静态方法不能访问实例数据成员 }

public void NoStaticMethod()//实例方法 { x=10;//正确,实例方法访问静态数据成员 y=20;//正确,实例方法访问实例数据成员 } }

public class Class1

{ public static void Main() { UseMethod m=new UseMethod();

UseMethod.StaticMethod();//使用静态方法格式为:类名.静态方法名 m.NoStaticMethod();//使用实例方法格式为:对象名.实例方法名 } }

1.10.4 方法的重载

在C#语言中,如果在同一个类中定义的函数名相同,而参数类型或参数个数不同,认为是不相同的函数,仅返回值不同,不能看作不同函数,这叫做函数的重载。前边Person类中定义了多个构造函数就是重载的例子。在C语言中,若计算一个数据的绝对值,则需要对不同数


C#入门经典第三版(最新)(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:品评员题库

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: