c#基础全接触_c#教程

2008-02-23 05:45:29来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

引用类型是类型安全的指针,他们的内存是分配在堆(保存指针地址)上的。
String、数组、类、接口和委托都是引用类型。
强制类型转换和as类型转换的区别:当类型转换非法时,强制类型转换将抛出一个System.InvalidCastException异常,
而as不会抛出异常,他返回一个null值。
用using创建别名:using console = System.Console;
访问限定符:
public 该成员能够被其他任何类访问
protected 该成员只能被其派生类访问
private 该成员只能被本类的其他成员访问
internal 该成员只能在当前编译单元的其他成员访问
带参数列表和返回值的Main方法:
class Test
{
public static int Main(string[] args)
{
foreach (string arg in args)
{
...
}
}
}
构造函数(constructor)包括实例构造函数和静态构造函数。
构造函数和类名相同,且不能有返回值。例:
class TestClass
{
TestClass() //实例构造函数:能够访问静态成员和实例成员,用于初始化实例成员
{
...
}

static TestClass() //静态构造函数:只能访问静态成员,用于初始化静态成员
{
...
}
}
类的静态成员属于类任何,不必生成实例就能够访问,他是在载入包含类的应用程式时创建的,
但静态方法不能访问类的实例变量和方法。通常,静态变量是在定义时就赋初始值的。
类的实例成员属于类的实例任何,不创建实例对象就无法对其进行访问,实例成员能够访问类的
静态成员和其他实例成员。
调用基类的析构函数:
class A
{
public A()
{
...
}
}
class B
{
public B(): base() //调用基类的析构函数
{
...
}
}
常量:其值是在编译时设定的,必须是数值文字。默认状态下常量是静态的。例:
class A
{
public const double pi = 3.1415;
}
常量是编译时就确定的值,只读字段是在运行才能确定的值。比如运行时才能确定的屏幕分辨率。
只读字段只能在类的析构函数中赋值。
静态只读字段:
class A
{
public static readonly int ScreenWidth; //静态只读字段
static A() //静态析构函数
{
ScreenWidth = 1024; //在静态析构函数中初始化
}
}
在类的继承中,类的析构函数是不会被继承的。
一个派生类只能从一个基类继承,不能同时从多个基类继承,但能够通过继承多个接口来
达到相同目的。实现多继承的唯一方法就是使用接口。例:
class MyFancyGrid: Control, ISerializable, IDataBound
{
...
}
密封类是不能继承的类,抽象类不能被定义为密封类,且密封类的私有成员不能用protected修饰,
只能用private。例:
sealed class A
{
...
}
关键字ref和out用于指定用引用方式传递方法的参数。
他们的区别是:ref参数必须初始化,而out参数无需初始化。所以在方法处理代码依赖参数的
初始化值时使用ref,不依赖初始化值时使用out。
对out参数即使在传递前对其进行了初始化,其值也不会传递到方法处理函数内部。传递时系统
会将其设为未初始化。所以在方法内部必须对out参数进行初始化。
方法重载时,必须参数数目和参数类型其中之一不同,返回值不同不能作为重载。
C#不支持方法的默认值,只能通过方法重载来实现。例:
class A
{
int Method(int a)
{
...
}

void Method(int a, int b) //参数数目不同
{ //返回值不同不能作为重载
...
}
}
params参数用于一个不定数目参数的方法,一般后面跟一个数组。例:
class A
{
public void Method(params int[] i)
{
...
}
}
方法的覆盖:指派生类覆盖基类的同名方法,有二种方法
1)第一种是在派生类要覆盖的方法前面加new修饰,而基类无需作任何改变。
这种方法的缺点是不能实现多态。例:
class A
{
public void Method() //无需任何修饰
{
...
}
}

class B: A //从基类继承
{
new public void Method() //覆盖基类的同名方法
{
...
}
}

class TestClass
{
A Instance = new B();
Instance.Method(); //这时将调用类A的Method方法,而不是类B的Method方法
}

2)第二种是在派生类要覆盖的方法前面加override修饰,而基类的同名方法前面加virtual修饰。
这样就能实现多态,例:

class A
{
virtual public void Method() //基类定义虚方法
{ //虚拟方法不能定义为private,因为private成员对派生类是无法访问的
...
}
}

class B: A //从基类继承
{
override public void Method() //派生类覆盖基类的同名虚方法
{
...
}
}

class TestClass
{
protected void Test()
{
A Instance = new B(); //定义一个实例,类型为基类,从派生类创建
//派生类总是能够向上转换为其基类
Instance.Method(); //将调用派生类B的Method方法,而不是基类的,这就是多态
}
}

说明:new修饰的方法覆盖不能实现多态的原因,是因为使用new时编译器只会实现早期绑定(early binding)。
即调用的方法在编译时就决定了:编译器看到Instance.Method()而Instance的类是A,就会调用类A的Method()方法。
override修饰的方法覆盖能够实现多态的原因,是因为实现了后期绑定(late binding)。
使用override时强制编译器在运行时根据类的真正类型正确调用相应的方法,而不是在编译时。
而基类的同名方法必须加virtual修饰。
类的静态方法可能通过 类名.静态方法名 这种格式来调用,不能使用 实例名.静态方法名 这种方法调用。
因为类的静态方法为类任何(是属于类本身的),而非实例任何(不是属于类的实例的)。
类的静态方法能够访问类的任何静态成员,但不能访问类的实例成员。
C#中类的变量称为字段。类的public变量称为类的公共字段。
类的属性由一个protected(也能够是private)字段和getter和setter方法构成:

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: c#中屏蔽窗体关闭的消息 _c#应用

下一篇: c 和c#混合生成.net程式 _c#应用