您的位置:首页 > 编程语言 > C#

红皮书c#高级编程(第6版)_第3章_对象和类型_类

2010-03-31 10:37 260 查看
3.2类成员

1.数据成员

包含类的数据:字段(与类相关的变量),常量,事件

/* 定义类 star */
class PhoneCustomer
{
//数据成员
public const string d = "Monday";
public int id = 0;
}
/* 定义类 end */

//实例化类
PhoneCustomer p = new PhoneCustomer();
//访问其数据成员
Response.Writer(p.id);


2.函数成员

提供了操作类中数据的功能

包含:方法,属性,构造函数,终结器,运算符,索引器

<1>方法

(1)方法声明

[modifiers] return_type MethodName([parameters])

{

//Method body

}

(2)方法调用:MethodName([parameters])

(3)给方法传递参数

c#中所有参数都是通过值来传递的,被调用方法得到的是变量的一个副本,方法退出后对变量的修改会丢失

ref关键字:迫使值参数通过引用传递给方法

//方法定义
public void Fun(ref int i)
{
i = 100;
}

//调用方法
int a = 0;

Fun(ref a);


out关键字:传递给方法的变量无需初始化,该变量通过引用传送

//方法定义
public void Fun(out int i)
{
i = 100;
}

//调用方法
int a;        //声明变量,无需初始化

Fun(out a);


(4)方法重载

方法的名相同,参数个数和类型不同

注:两个方法不能仅在返回类型上有区别!

两个方法不能仅根据参数声明为ref还是out来区别!

<2>属性(property)

一个方法或一对方法,在客户机代码看,它们是一个字段

允许在属性的访问器get, set前添加不同的访问修饰符(protected,private...)

//私有属性采用camel命名规则
private string foreName;

//公共属性采用Pascal命名规则
public string ForeName
{
//只读属性:不带参,必须返回属性声明的类型
get
{
return foreName;
}
//只写属性:不带参,但编译器假定它带一个参数,类型与属性同,表示为value
set
{
if(value.length > 20)
{}
else
{
foreName = value;
}
}

/*
在属性定义中省略set或get访问器,可创建只读或只写属性
*/
}


<3>构造函数

与类同名的方法,无返回类型,如没提供任何构造函数,编译器会自动创建一个默认构造函数,初始化所有成员字段为标准默认值

例如:引用类型为空引用,数字数据类型为0,bool为false

如果现实提供带参数的构造函数,不可用默认构造函数实例化对象

注:可以把构造函数定义为private或protected,防止不相关类访问(不能用new在外部代码中实例化)

(1)静态构造函数

using System;

/// <summary>
///StaticMyClass 的摘要说明
/// </summary>
public class StaticMyClass
{
public static readonly string color;

/*
定义静态构造函数
* 注:1.静态构造函数没有访问修饰符
* 2.静态函数不带任何参数,返回值
* 3.一个类只有一个静态构造函数
* 4.静态构造函数只能访问静态成员
* 5.静态构造函数至多运行一次,在代码引用类之前执行
*/
static StaticMyClass()
{
DateTime now = DateTime.Now;

if (now.DayOfWeek == DayOfWeek.Saturday)
{
color = "Green";
}
else
{
color = "Red";
}
}

public StaticMyClass()
{ }

/***** 创建静态构造函数的原因:类有些静态字段属性,要在第一次使用类前,初始化^-^ *****/
}

//调用类中的静态属性
Response.Write(StaticMyClass.color);        //输出"Red"


(2)从其他构造函数中调用构造函数(构造函数初始化器)

using System;

/// <summary>
///Car 的摘要说明
/// </summary>
public class Car
{
public string description;
public int wheels;
public string name;
public string other;

public Car()
{
this.description = "null";
this.wheels = 0;
this.name = "11";
}

public Car(string description,int wheels,string name)
{
this.description = description;
this.wheels = wheels;
this.name = name;
}

/*
public Car(string descripton)
{
this.description = description;
this.wheels = 4;
this.name = "66";
}
*/

/**** 如以上定义的两构造函数导致初始化了相同字段 ****/

//使用c#构造函数初始化器,等同于上面带一个参数的构造函数
public Car(string description) : this(description, 4, "66")
{
other = "调用一个参数的构造函数!";
}

/****
* 构造函数初始化符可包含对同一类另一构造函数的调用
* 也可包含对直接基类构造函数的调用(this关键字换为base)
* 构造函数初始化器只调用参数个数最匹配的一个构造函数
****/
}

//调用
Car c = new Car("使用构造函数初始化器");
Response.Write(c.description+c.wheels+c.name+c.other);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: