属性是一个方法或一对方法,从客户机来看,它们是一个字段,例如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 评论:
发表评论