c#学习笔记 016 (类成员 下)

2008年12月30日星期二

c#学习笔记 016 (类成员 下)

属性是一个方法或一对方法,从客户机来看,它们是一个字段,例如Windows窗体的Height属性:

mainFrom.Height=400;

表面上似乎设置了一个字段,但实际上是调用了属性访问器。

c#中定义属性可以使用以下代码:

public string SomeProperty
{
get
{
return "This is the property value";
}

set
{
//do whatever needs to be done to set the property
}
}

get访问器无参数,set访问器没有显式参数,类型与属性相同,例如:

private string foreName;

public string ForeName
{
get
{
return foreName;
}

set
{
if (value.Length>20)
//code here to take error recovery action
//(eg. throw an exception)
else
foreName=value;
}
}

只读和只写属性

在属性定义中省略set访问器,就可以创建只读属性:例如:

private string foreName;

public string ForeName
{
get
{
return foreName;
}
}

在属性中省略get访问器,就可以创建只写属性。

get、set访问器可以设置,public、protected、private访问修饰符,没有访问修饰符表示该访问器具有属性的访问级别,在两个访问器中至少有一个具备属性的访问级别,否则编译会出错。

自动实现的属性:

如果两个访问器中没有任何逻辑,就可以使用自动实现的属性,例如:

public string ForeName {get;set;}

不需要声明 private string foreName 编译器会自动创建他。

不能这样设置只读属性 public string ForeName{get;}

可以使用访问修饰符 public string ForeName{get;private set;}

内联:

在编译器中决定,我们无法决定。

构造函数:

构造函数没有返回类型,与类同名,例如:

public class Myclass
{
public MyClass
{

}
}

不写构造函数的代码,会生成一个默认的构造函数,功能是给成员字段初始化,基本字段值为0。

可以为构造函数编写任意多的重载,只要签名不同。

如果提供带参数的构造函数,编译器就不会再提供默认的构造函数。例如:

public class MyNumber
{
private int number;

public MyNumber(int number)
{
this.number=number;
}
}

用this区分成员字段和同名的参数。以下无参数的构造函数调用会出错:

MyNumber numb=new MyNumber();

可以把构造函数定义为private或protected,这样不相关的类就不能访问它们。

public class MyNumber
{
private int number;
private MyNumber(int number)
{
this.number=number;
}
}

此例不能用new关键字实例化类的对象,可以编写一个公共静态属性或方法,进行实例化:

1、类仅用做某些静态成员或属性的容器,因此永远不会实例化

2、希望类仅通过调用某个静态成员函数来实例化(这就是所谓对象实例化的类代理方法)

静态构造函数:

C#可以给类编写无参数的静态构造函数。这种构造函数只能执行一次。例如:

class MyClass
{
static Myclass()
{
//initialization code
}
//rest of class definition
}

这样编写的原因是,类有一些静态字段或属性,需要在第一次使用类之前,从外部源中初始化这些静态字段和属性。

无法确定静态构造函数的执行时刻,只能保证该类在使用前静态构造函数一定也只会被执行一次。

在C#中静态构造函数通常在第一次调用类的成员之前执行。

静态构造函数没有访问修饰符,其他c#代码也从不调用它,由.NET运行库决定什么时候运行。

一个类只能有一个静态构造函数,不能有参数,只能访问静态成员,不能方位实例成员。

一个类可以同时具有无参数的实例构造函数和静态构造函数。

静态构造函数的例子:

using System;
using System.Drawing;

namespace Wrox.ProCSharp.StaticConstructorSample
{
public class UserPreferences
{
public static readonly Color BackColor;

static UserPreferences()
{
DateTime now=DateTime.Now;
if (now.DayOfWeek==DayOfWeek.Saturday||now.DayOfWeek==DayOfWeek.Sunday)
BackColor=Color.Green;
else
Backcolor=Color.Red;
}

private UserPreferences()
{
}
}
}

这段代码说明了颜色设置如何存储在静态变量中。只读字段只能被构造函数初始化。

用下面的代码测试静态构造函数:

class MainEntryPoint
{
static void Main(String[] args)
{
Console.WriteLine("User-preferences:BackColor is : "+UserPreferences.BackColor.ToString());
}
}

输出结果:

User-preferences:BackColor is : Color [Red]

有时在一个类中有几个构造函数,以容纳某些可选的参数,这些构造函数包含一些共同的代码,例如:

class Car
{
private String description;
private uint nWheels;

public Car(String model,uint nWheels)
{
this.description=description;
this.nWheels=nWheels;
}

public Car(String description)
{
this.description=description;
this.nWheels=4
}
}

c#有一个特殊的语法,称为构造函数初始化器,可以把代码放在一个地方,避免重复。

class Car
{
private String description;
private uint nWheels;

public Car(String description,uint nWheels)
{
this.description=description;
this.nWheels=nWheels;
}

public Car(String description):this(model,4)
{
}
}

使用base调用直接基类的构造函数。

只读字段:

readonly 关键字比const灵活,允许把一个字段设施为常量,但可以执行计算以确定它的初始值。可以在构造函数中给只读字段赋值,只读字段可以是实例字段。

构造函数可以不给只读字段赋值,为其数据类型的默认值,或者声明时给它的初始值。

    0 评论:

    发表评论