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

C#字段、接口、抽象解释

2008-06-23 11:49 134 查看

修饰字段

字段,成员变量,它表示存储位置,是C#中类不可缺少的一部分.

修饰字段C#提供5种:

internal :扩展了C++原来的friend修饰符.在有必要使两个类的某些字段相互可见时,我们将这些类的字段声明为 internal,然后将它们放在一个程序集中编译即可.如果对它们的继承子类也可见的话,声明为protected internal实际这也是程序集本来的意图,即将逻辑相关的的类组合封装在一起.

readonly只读字段:只读不能进行写操作,const关键字也不能被修改

1.const ,readonly的值一旦被初始化都不可以在改写

2.const只能在声明时初始化 ,readonly即可以在声明时初始化,也可以在构造器中初始化.

3.const隐含static,不可以再写static const;readonly不默认static,如需要可以写static readonly

4.const是编译静态解析的常量,因此起表达式必须在编译时就可以求值,readonly是运行期动态解析的常量

5.const可用来修饰类中的成员,也可以修饰函数体内的局部变量;readonly只可以用于修饰类中的成员

static 静态方法

1.静态方法是一种特殊的成员方法,它不属于类的某一个具体的实例,属于类本身。

class MyClass
{
public static int add(int x,int y)
{
........//代码
}
}
using syestem;
class class1
{
[STAThread]
static void Main()
{
int i=MyClass.add(3,5);//调用静态方法
}
}


2.static:静态字段属于类,为类的所有对象所共用.非静态字段属于某个具体的对象,为特定的对象专有.

非静态成员在类的每个实例中都占有一个存储或者说是一个副本,而静态方法为类所共享的它无法判断当前 的非静态成员属于那一个实例。

所以在静态方法不能使用非静态成员


class A
{
int x;
static int y;
static int F()
{
x=1;//错误,不容许访问非静态成员
y=2;//正确
}
}


 C#严格归定非静态字段只能通过对象来访问,静态字段只能通过类来访问。

c#中abstract与virtual的区别

1.abstract方法只能在抽象类中声明,虚方法则不是。

abstract方法必须在派生类中重写,而virtual则不必

2.abstract方法不能声明方法实体,

abstract public void SD();

虚方法则可以

public virtual void sdf()
{
Console.WriteLine("A");
}


3.虚方法可以实现多态,而抽象方法不可以。。。

virtual标记方法为虚方法

1.可在派生类中以override覆盖此方法

2.不覆盖也可由对象调用

3.无此标记的方法(也无其他标记),重写时需用new隐藏原方法

abstract 与virtual : 方法重写时都使用 override 关键

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class Test
{
public static void Main(String[] args)
{
A a=new B();
Console.Write(a.getVal()); // 输出:A 虽然实例是B,但是执行的却是A的方法

a=new C();
Console.Write(a.getVal()); // 输出:C 实例是C,而且C重写的A的方法,所以执行C的方法

B b=new B();
Console.Write(b.getVal()); // 输出:B 只有定义和实例都是B,才执行B的方法
}
}
class A
{
// 要允许子类重写,方法必须标识为virtual 或 abstract
public virtual String getVal(){
return "A";
}
}
class B : A
{
// 隐藏父类方法 用new标识,不标识时会出现编译警告,不影响使用
//调用的时候会运行基类的同名方法,而不会调用子类有new关键字的方法
public new String getVal(){
return "B";
}
}
class C : A
{
// 重写方法 必须用override标识
public override String getVal(){
return "C";
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: