摘要:

在本文中,我们侧重给大家介绍面向对象的编程思想和C#2.0中新增功能,让大家进一步掌握OOP编程内涵以及一些C#编程技巧。

注:本系列节选自MSDN Webcasts上邵志东老师的《 .NET Windows编程系列课程》PPT内容,在我的Blog中整理发表,方便大家一同参考!此系列相关资料请到这里下载。 

本节主要内容:

C#语法

C#面向对象编程

一、C#语法

  • 数组
  • 委托
  • 可空类型
  • 泛型

数组

1.数组概述

C# 数组从零开始建立索引,即数组索引从零开始。声明数组时,方括号([]) 必须跟在类型后面,而不是标识符后面。
数组的大小不是其类型的一部分,数组使用需要初始化。
例如:int[] numbers; numbers = new int[10]; numbers = new int[20];

2.数组是对象

在C# 中,数组实际上是对象。System.Array是所有数组类型的抽象基类型。
可以使用System.Array具有的属性以及其他类成员。这种用法的一个示例是使用“长度”(Length)属性获取数组的长度。下面的代码将 numbers 数组的长度(为 5)赋给名为 LengthOfNumbers 的变量:
int[] numbers = {1, 2, 3, 4, 5};
int LengthOfNumbers = numbers.Length;
System.Array类提供许多有用的其他方法/属性,如用于排序、搜索和复制数组的方法。

3.多维数组

使用多个下标访问其元素的数组。
二维数组:平面上点的坐标pt(x,y)
  声明:double[,] dbHeight=new double[3,4]; double[,] dbHeight={ {1,2,3,4},{2,3,4,5},{3,4,5,6} };

4.数组的数组

数组的每个元素是数组,声明方式int[][] arrayInt;
方式一:
arrayInt=new int[2][];//注意不能用
arrayInt=new int[3][4]!
arrayInt[0]=new int[3];
arrayInt[1]=new int[4];
方式二:arrayInt={new int[]{1,2,3,},new int[]{4,5,6,7}};

5.参数数组

参数的类型:值参数、引用参数、输出参数
一种新类型的参数: 参数数组
可以使用个数不定的参数调用函数,必须是参数定义中的最后一个参数,
用关键字params说明,params参数必须是一维数组,例如:public void fun(params in[]args)
DEMO1:数组练习

委托

1.委托

委托使用的目标:把函数作为参数传递,类似于C++中的函数指针。是事件处理的基础。
委托是面向对象的、类型安全的和保险的。
委托声明: delegate 函数返回类型名 委托名(函数参数)
delegate double process(double db1);
DEMO2:委托练习

2.匿名方法

匿名方法(anonymous methods)允许将与一个委托关联的代码“内联(in-line)”到使用委托的地方,我们可以很方便地将代码直接写在委托实例中。
匿名方法还共享对本地语句所包含的函数成员的访问。要将代码块传递为委托参数,创建匿名方法则是唯一的方法。

可空类型

可空类型表示可被赋值为null 值的值类型变量。无法创建基于引用类型的可空类型。(引用类型已支持null 值。)。
语法T? 是System.Nullable<T> 的简写,此处的T 为值类型。这两种形式可以互换。
为可空类型赋值与为一般值类型赋值的方法相同,如int? x = 10; 或double? d = 4.108;。
如果基础类型的值为null,请使用System.Nullable.GetValueOrDefault属性返回该基础类型所赋的值或默认值,例如int j = x.GetValueOrDefault();
请使用HasValue和Value 只读属性测试是否为空和检索值。可空类型变量的默认值将HasValue设置为false。未定义Value。
使用?? 运算符分配默认值,当前值为空的可空类型被赋值给非空类型时将应用该默认值,如int? x = null; int y = x ?? -1;。
不允许使用嵌套的可空类型。将不编译下面一行:Nullable<Nullable<int>> n;
DEMO3:可空类型

泛型

泛型允许类、接口、结构、委托和方法通过它们所存储和操作的数据的类型来指定类型。
这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。
和使用object类相比,泛型降低了装箱和拆箱的负担,减少了类型转换所带来的错误
使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。泛型最常见的用途是创建集合类。
DEMO4:泛型示例

二、C#面向对象编程

面向对象的程序设计

1.基本概念

对象(object):对象是面向对象开发方法的基本成分。每个对象可用它本身的一组属性和其上的一组操作来定义。
类(Class):类是一组具有相同数据结构和相同操作的对象的集合。类是对一系列具有相同性质的对象的抽象,是对对象共同特征的描述。
继承(inheritance):继承是使用已存在的定义作为基础建立新定义的技术新

1.类的声明

public class Test :object{ }

2.类的成员有以下类型

成员常量:代表与类相关联的常量值。
域即类中的变量
成员方法:负责执行类中的计算和其它操作
属性:用于定义类中的值并对它们进行读写
事件:用于说明发生了什么事情
操作符:定义类中特有的操作
构造函数和析构函数:分别用于对类的实例进行初始化和销毁修饰符类名基类类体

3.类的成员

共有(public):允许类的使用者从外部进行访问
保护(protected):派生类可以访问
私有(private):仅限于类中的成员可以访问

4、静态成员

若将类中的某个成员声明为static 该成员称为静态成员。
类中的成员要么是静态要么是非静态的。静态成员由类访问;非静态成员由对象访问。
一般说来静态成员是属于类所有的非静态成员则属于类的实例——对象。
静态方法为类所有,因此不要创建类的实例就可以调用。如System.math类。
DEMO5:静态成员

5.构造函数

构造函数用于执行类的实例的初始化。
每个类都有构造函数。即使我们没有声明它,编译器也会自动地为我们提供一个默认的构造函数。
在访问一个类的时候,系统将最先执行构造函数中的语句。与类名相同的方法。
构造函数可以重载(多个参数不同的构造函数)

6.继承

继承的基本概念C#中的继承符合下列规则:
继承是可传递的。如果C 从B 中派生,B 又从A 中派生,那么C 不仅继承了B 中声明的成员,同样也继承了A 中的成员。Object 类作为所有类的基类。
派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去已经继承的成员的定义。
构造函数和析构函数不能被继承。除此以外的其它成员,不论对它们定义了怎样的访问方式,都能被继承。基类中成员的访问方式只能决定派生类能否访问它们。
类可以定义虚方法、虚属性以及虚索引指示器。它的派生类能够重载这些成员,从而实现类可以展示出多态性。

7.多态

虚函数:当类中的方法声明前加上了virtual 修饰符。我们称之为虚方法。反之为非虚。使用了virtual 修饰符后不允许再有static, abstract, 或override 修饰符。
重载:在派生类中重新定义此虚函数时,要求的是方法名称、返回值类型、参数表中的参数个数、类型顺序都必须与基类中的虚函数完全一致。在派生类中声明对虚方法的重载要求在声明中加上override 关键字,而且不能有new, static 或virtual 修饰符。
DEMO6:多态性示例

属性和索引指示器

1.属性

属性是对现实世界中实体特征的抽象。它提供了对类或对象性质的访问。
C#中的属性更充分地体现了对象的封装性:不直接操作类的数据内容,而是通过访问器进行访问。它借助于get 和set 对属性的值进行读写。

2.索引指示器

索引指示器(indexer) 使得可以像数组那样对对象使用下标。它为我们提供了通过索引方式方便地访问类的数据信息的方法。
get 访问器返回值。set 访问器分配值。 this 关键字用于定义索引器。 value 关键字用于定义由set 索引器分配的值。
索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。
索引器可被重载。索引器可以有多个形参,例如当访问二维数组时。
DEMO7:索引指示器

命名空间

.NET Framework 使用命名空间来组织它的众多类
命名空间
同类功能的类的集合。如System.Drawing中包含了各种绘图功能的类。名称空间是包含类的。
Microsoft.VisualBasic.MyServices命名空间(Visual Basic 中的My)提供对许多.NET Framework 类的简单直观的访问,使您能够编写可与计算机、应用程序、设置、资源等交互的代码。虽然MyServices命名空间最初是为使用Visual Basic 而设计的,但它也可以在C# 应用程序中使用。
DEMO8:使用My 命名空间

posted on 2008-09-04 21:04  freehand  阅读(301)  评论(0编辑  收藏  举报