当前位置:首页 > c#定义
static void main() {
int i = 0; int j;
while(i < 10){
j = i * i;
console.writeline(\
i = i + 1; } } }
c#要求局部变量在其值被获得之前明确赋值(definitely)。例如,假设前面的变量i的声明没有包含初始值,那么,在接下来对i的使用将导致编译器报告错误,原因就是i在程序中没有明确赋值。
方法能够使用return语句将控制返回给它的调用方。如果方法是void的,则return语句不能指定表达式;如果方法是非void的,则return语句必须包含表达式,用于计算返回值。
1.6.5.3 静态方法和实例方法
若一个方法声明中含有static修饰符,则称该方法为静态方法(static method)。静态方法不对特定实例进行操作,只能访问静态成员。
若一个方法声明中没有static修饰符,则称该方法为实例方法(instance method)。实例方法对特定实例进行操作,既能够访问静态成员,也能够访问实例成员。在调用实例方法的实例上,可以用 this来访问该实例,而在静态方法中引用this是错误的。
下面的entity类具有静态和实例两种成员:
class entity {
static int nextserialno;
int serialno;
public entity() {
serialno = nextserialno++; }
public int getserialno() {
return serialno; }
public static int getnextserialno() {
return nextserialno; }
public static void setnextserialno(int value) {
nextserialno = value; } }
每一个entity实例包含一个序列号(并且假定这里省略了一些其他信息)。entity构造函数(类似于实例方法)用下一个有效的序列号初始化新的实例。因为构造函数是一个实例成员,所以,它既可以访问serialno实例字段,也可以访问nextserialno静态字段。
getnextserialno和setnextserialno静态方法能够访问nextserialno静态字段,但是如
果访问serialno实例字段就会产生错误。
下面的示例展示了entity类的使用:
using system;
class test {
static void main() {
entity.setnextserialno(1000);
entity e1 = new entity();
entity e2 = new entity();
console.writeline(e1.getserialno()); //输出 \
console.writeline(e2.getserialno()); //输出 \
console.writeline(entity.getnextserialno()); //输出 \ } }
注意,setnextserialno和getnextserialno静态方法通过类调用,而getserialno实例成员则通过类的实例调用。
1.6.5.4 虚拟方法、重写方法和抽象方法
若一个实例方法的声明中含有virtual修饰符,则称该方法为虚拟方法(virtual method)。若其中没有virtual修饰符,则称该方法为非虚拟方法(nonvirtual method)。
在一个虚拟方法调用中,该调用所涉及的实例的运行时类型(runtime type)确定了要被调用的究竟是该方法的哪一个实现。在非虚拟方法调用中,实例的编译时类型(compile-time type)是决定性因素。
虚拟方法可以由派生类重写(override)译注7实现。当一个实例方法声明中含有override修饰符时,该方法将重写所继承的相同签名的虚拟方法。虚拟方法声明用于引入新方法,而重写方法声明则用于使现有的继承虚拟方法专用化(通过提供该方法的新实现)。
抽象(abstract)方法是没有实现的虚拟方法。抽象方法的声明是通过abstract修饰符实现的,并且只允许在抽象类中使用抽象方法声明。非抽象类的派生类需要重写抽象方法。
下面的示例声明了一个抽象类expression,它表示一个表达式树的节点;它有三个派生类constant,variablereference,operation,它们实现了常数、变量引用和算术运算的表达式树节点。
using system;
using system.collections;
public abstract class expression {
public abstract double evaluate(hashtable vars); }
public class constant: expression {
double value;
public constant(double value) {
this.value = value; }
public override double evaluate(hashtable vars) {
共分享92篇相关文档