原文出处:http:
//
www.codeguru.com/cs_syntax/CSharp.html
原作者:AishaIkram
在一些术语上我尽量做到与MSDN的中文资料所述术语保持一致
使用环境:.NET,C#,WinXP,Win 2000
绪论
C#是这样的一种语言,具有C ++ 的特点,象Java一样的编程风格,并且象Basic一样的快速开发模型。如果你已经知道了C ++ ,本文会在不到一个小时的时间内让你迅速掌握C#的语法。熟悉Java的括会更好,因为Java的程序结构、打包(Packages)和垃圾收集的概念有助于你更快的了解C#。因此在讨论C#的构造时,我会假定你了解C ++ 。
本文会讨论C#语言的构造与特点,同时会采取简洁的和你能理解的方式使用些代码示例,我们会尽量让你能稍微看看这些代码就能理解这些概念。
注意:本文不是为C#高手(C#gurus)所写.这是针对在C#学习上还是初学者的文章。
下面是将要讨论的C#问题的目录:
程序结构
命名空间
数据类型
变量
运算符和表达式
枚举
语句(Statements)
类(Classes)和结构(Structs)
修饰符(Modifiers)
属性(Properties)
接口(Interfaces)
方法参数(FunctionParameters)
数组(Arrays)
索引器(Indexers)
装箱及拆箱操作
委托(Delegates)
继承和多态
下面的内容将不会在被讨论之列:
C ++ 与C#谁更通用
诸如垃圾回收、线程以及文件处理等概念
数据的类型转换
异常处理
.NET库
-------------------
程序结构
-------------------
这一点象C ++ ,C#是一种对大小写字母敏感的语言,分号“;”是语句间的分隔符。与C ++ 不同的是,C#当中声明代码文件(头文件)与实现代码文件(cpp文件)不是独立存在的,所有代码(类声明和类实现)都位于一个扩展名为cs的文件内。
让我们瞧瞧C#当中的Helloworld程序是怎样的。
using System;
namespace MyNameSpace
{
class HelloWorld
{
static void Main( string []args)
{
Console.WriteLine( " HelloWorld " );
}
}
}
在C#当中的每样东西都被封装到一个类中,C#的类又被封装到一个命名空间当中(就象一个文件夹中的文件)。类似于C ++ ,main方法是你的程序的入口点。C ++ 的main函数调用名称是 " main " ,而C#的main函数是以大写字母M为起点的名称是 " Main " 。
没有必要把分号分隔符放在类语句块或者结构定义语句块后。这在C ++ 当中被要求,但在C#当中却不是。
-------------------
命名空间
-------------------
每一个类都被包装进一个命名空间。命名空间的概念与C ++ 的完全相同,但在C#当中使用命名空间的频率较C ++ 还高。你可以使用点限定符(dotqulifier)访问一个类。在上面的helloworld程序当中MyNameSpace就是一个命名空间。
现在思考这样的一个问题,你想从某些别的类的命名空间当中来访问HelloWorld这个类该如何操作。
这有一个例子:
using System;
namespace AnotherNameSpace
{
class AnotherClass
{
public void Func()
{
Console.WriteLine( " HelloWorld " );
}
}
}
现在,从你的HelloWorld类里你能象这样去访问上面的这个AnotherNameSpace的命名空间:
using System;
using AnotherNameSpace; // youwilladdthisusingstatement
namespace MyNameSpace
{
class HelloWorld
{
static void Main( string []args)
{
AnotherClassobj = new AnotherClass();
obj.Func();
}
}
}
在.NET库当中,System是位于顶层的命名空间,别的命名空间都存在这个命名空间之下。默认状态下,存在一个全局的命名空间,因此一个在命名空间外定义的类将直接在这个全局命名空间之下;因此,你能在没有任何点限定符的情况下访问这个类。
你也可以象下面这样定义嵌套的命名空间。
Using
C ++ 当中的 " #include " 指示被C#的 " using " 关键字取代,它后面跟着一个命名空间的名字。正如上面的 " usingSystem " 。 " System " 是别的所有被封装的命名空间和类中最底层的命名空间。所有对象的基类都是System命名空间内的Object类派生的。
-------------------
变量
-------------------
除以下并别外,C#当中的变量几乎与C ++ 同:
与C ++ 不同,C#变量被访问之前必须被初始化;否则编译时会报错。因此,访问一个未初始化变量是不可能的事。
C#中你不会访问到一个不确定的指针。(译者注:严格说起来C#已经把指针概念异化,限制更严格。所以有些资料上会说C#取消了指针概念)
一个超出数组边界的表达式是不可访问的。
C#中没有全局的的变量或全局函数,全局方式的操作是通过静态函数和静态变量来实现的。
-------------------
数据类型
-------------------
所有C#数据类型都派生自基类Object。这里有两类数据类型:
基本型 / 内置型用户自定义型
下面一个C#内置类型列表:
类型字节数解释
byte 1 无符号字节型
sbyte 1 有符号字节型
short 2 有符号短字节型
ushort 2 无符号短字节型
int 4 有符号整型
uint 4 无符号整型
long 8 有符号长整型
ulong 8 无符号长整型
float 4 浮点数
double 8 双精度数
decimal 8 固定精度数
string unicode字串型
char unicode字符型
bool 真假布尔型
注意:C#当中的类型范围与C ++ 有所不同;例如,C ++ 的long型是4个字节,而在C#当中是8个字节。同样地,bool型和string型都不同于C ++ 。bool型只接受true和false两种值。不接受任何整数类型。
用户定义类型包括:
类类型( class )
结构类型( struct )
接口类型( interface )
数据类型的内存分配形式的不同又把它们分成了两种类型:
值类型(valueTypes)
引用类型(ReferenceTypes)
值类型:
值类型数据在栈中分配。他们包括:所有基本或内置类型(不包括string类型)、结构类型、枚举类型( enum type)
引用类型:
引用类型在堆中分配,当它们不再被使用时将被垃圾收集。它们使用new运算符来创建,对这些类型而言,不存在C ++ 当中的delete操作符,根本不同于C ++ 会显式使用delete这个运算符去释放创建的这个类型。C#中,通过垃圾收集器,这些类型会自动被收集处理。
引用类型包括:类类型、接口类型、象数组这样的集合类型类型、字串类型、枚举类型
枚举类型与C ++ 当中的概念非常相似。它们都通过一个enum关键字来定义。
示例:
enum Weekdays
{
Saturday,Sunday,Monday,Tuesday,Wednesday,Thursday,Friday
}
类类型与结构类型的比较
除了在内存分配形式上外,类与结构的概念完全与C ++ 相同。类的对象被分配在堆中,并且通过new来创建,结构也是被new创建但却被分配在栈当中。C#当中,结构型适于快速访问和拥有少量成员的数据类型。如果涉及量较多,你应该创建一个类来实现他。
(译者注:这与堆和栈内存分配结构的特点有关。简而言之,栈是一种顺序分配的内存;堆是不一定是连续的内存空间。具体内容需要大家参阅相关资料)
示例:
struct Date
{
int day;
int month;
int year;
}
class Date
{
int day;
int month;
int year;
string weekday;
string monthName;
public int GetDay()
{
return day;
}
public int GetMonth()
{
return month;
}
public int GetYear()
{
return year;
}
public void SetDay( int Day)
{
day = Day;
}
public void SetMonth( int Month)
{
month = Month;
}
public void SetYear( int Year)
{
year = Year;
}
public bool IsLeapYear()
{
return (year / 4 == 0 );
}
public void SetDate( int day, int month, int year)
{
}
}
-------------------
属性
-------------------
如果你熟悉C ++ 面象对象的方式,你就一定有一个属性的概念。在上面示例当中,以C ++ 的观点来看,Data类的属性就是day、month和year。用C#方式,你可以把它们写成Get和Set方法。C#提供了一个更方便、简单、直接的方式来访问属性。
因此上面的类可以被写成:
using System;
class Date
{
public int Day {
get {
return day;
}
set {
http://www.cnblogs.com/Images/OutliningIndicators/InBloc
原作者:AishaIkram
在一些术语上我尽量做到与MSDN的中文资料所述术语保持一致
使用环境:.NET,C#,WinXP,Win 2000
绪论
C#是这样的一种语言,具有C ++ 的特点,象Java一样的编程风格,并且象Basic一样的快速开发模型。如果你已经知道了C ++ ,本文会在不到一个小时的时间内让你迅速掌握C#的语法。熟悉Java的括会更好,因为Java的程序结构、打包(Packages)和垃圾收集的概念有助于你更快的了解C#。因此在讨论C#的构造时,我会假定你了解C ++ 。
本文会讨论C#语言的构造与特点,同时会采取简洁的和你能理解的方式使用些代码示例,我们会尽量让你能稍微看看这些代码就能理解这些概念。
注意:本文不是为C#高手(C#gurus)所写.这是针对在C#学习上还是初学者的文章。
下面是将要讨论的C#问题的目录:
程序结构
命名空间
数据类型
变量
运算符和表达式
枚举
语句(Statements)
类(Classes)和结构(Structs)
修饰符(Modifiers)
属性(Properties)
接口(Interfaces)
方法参数(FunctionParameters)
数组(Arrays)
索引器(Indexers)
装箱及拆箱操作
委托(Delegates)
继承和多态
下面的内容将不会在被讨论之列:
C ++ 与C#谁更通用
诸如垃圾回收、线程以及文件处理等概念
数据的类型转换
异常处理
.NET库
-------------------
程序结构
-------------------
这一点象C ++ ,C#是一种对大小写字母敏感的语言,分号“;”是语句间的分隔符。与C ++ 不同的是,C#当中声明代码文件(头文件)与实现代码文件(cpp文件)不是独立存在的,所有代码(类声明和类实现)都位于一个扩展名为cs的文件内。
让我们瞧瞧C#当中的Helloworld程序是怎样的。
using System;
namespace MyNameSpace
{
class HelloWorld
{
static void Main( string []args)
{
Console.WriteLine( " HelloWorld " );
}
}
}
在C#当中的每样东西都被封装到一个类中,C#的类又被封装到一个命名空间当中(就象一个文件夹中的文件)。类似于C ++ ,main方法是你的程序的入口点。C ++ 的main函数调用名称是 " main " ,而C#的main函数是以大写字母M为起点的名称是 " Main " 。
没有必要把分号分隔符放在类语句块或者结构定义语句块后。这在C ++ 当中被要求,但在C#当中却不是。
-------------------
命名空间
-------------------
每一个类都被包装进一个命名空间。命名空间的概念与C ++ 的完全相同,但在C#当中使用命名空间的频率较C ++ 还高。你可以使用点限定符(dotqulifier)访问一个类。在上面的helloworld程序当中MyNameSpace就是一个命名空间。
现在思考这样的一个问题,你想从某些别的类的命名空间当中来访问HelloWorld这个类该如何操作。
这有一个例子:
using System;
namespace AnotherNameSpace
{
class AnotherClass
{
public void Func()
{
Console.WriteLine( " HelloWorld " );
}
}
}
现在,从你的HelloWorld类里你能象这样去访问上面的这个AnotherNameSpace的命名空间:
using System;
using AnotherNameSpace; // youwilladdthisusingstatement
namespace MyNameSpace
{
class HelloWorld
{
static void Main( string []args)
{
AnotherClassobj = new AnotherClass();
obj.Func();
}
}
}
在.NET库当中,System是位于顶层的命名空间,别的命名空间都存在这个命名空间之下。默认状态下,存在一个全局的命名空间,因此一个在命名空间外定义的类将直接在这个全局命名空间之下;因此,你能在没有任何点限定符的情况下访问这个类。
你也可以象下面这样定义嵌套的命名空间。
Using
C ++ 当中的 " #include " 指示被C#的 " using " 关键字取代,它后面跟着一个命名空间的名字。正如上面的 " usingSystem " 。 " System " 是别的所有被封装的命名空间和类中最底层的命名空间。所有对象的基类都是System命名空间内的Object类派生的。
-------------------
变量
-------------------
除以下并别外,C#当中的变量几乎与C ++ 同:
与C ++ 不同,C#变量被访问之前必须被初始化;否则编译时会报错。因此,访问一个未初始化变量是不可能的事。
C#中你不会访问到一个不确定的指针。(译者注:严格说起来C#已经把指针概念异化,限制更严格。所以有些资料上会说C#取消了指针概念)
一个超出数组边界的表达式是不可访问的。
C#中没有全局的的变量或全局函数,全局方式的操作是通过静态函数和静态变量来实现的。
-------------------
数据类型
-------------------
所有C#数据类型都派生自基类Object。这里有两类数据类型:
基本型 / 内置型用户自定义型
下面一个C#内置类型列表:
类型字节数解释
byte 1 无符号字节型
sbyte 1 有符号字节型
short 2 有符号短字节型
ushort 2 无符号短字节型
int 4 有符号整型
uint 4 无符号整型
long 8 有符号长整型
ulong 8 无符号长整型
float 4 浮点数
double 8 双精度数
decimal 8 固定精度数
string unicode字串型
char unicode字符型
bool 真假布尔型
注意:C#当中的类型范围与C ++ 有所不同;例如,C ++ 的long型是4个字节,而在C#当中是8个字节。同样地,bool型和string型都不同于C ++ 。bool型只接受true和false两种值。不接受任何整数类型。
用户定义类型包括:
类类型( class )
结构类型( struct )
接口类型( interface )
数据类型的内存分配形式的不同又把它们分成了两种类型:
值类型(valueTypes)
引用类型(ReferenceTypes)
值类型:
值类型数据在栈中分配。他们包括:所有基本或内置类型(不包括string类型)、结构类型、枚举类型( enum type)
引用类型:
引用类型在堆中分配,当它们不再被使用时将被垃圾收集。它们使用new运算符来创建,对这些类型而言,不存在C ++ 当中的delete操作符,根本不同于C ++ 会显式使用delete这个运算符去释放创建的这个类型。C#中,通过垃圾收集器,这些类型会自动被收集处理。
引用类型包括:类类型、接口类型、象数组这样的集合类型类型、字串类型、枚举类型
枚举类型与C ++ 当中的概念非常相似。它们都通过一个enum关键字来定义。
示例:
enum Weekdays
{
Saturday,Sunday,Monday,Tuesday,Wednesday,Thursday,Friday
}
类类型与结构类型的比较
除了在内存分配形式上外,类与结构的概念完全与C ++ 相同。类的对象被分配在堆中,并且通过new来创建,结构也是被new创建但却被分配在栈当中。C#当中,结构型适于快速访问和拥有少量成员的数据类型。如果涉及量较多,你应该创建一个类来实现他。
(译者注:这与堆和栈内存分配结构的特点有关。简而言之,栈是一种顺序分配的内存;堆是不一定是连续的内存空间。具体内容需要大家参阅相关资料)
示例:
struct Date
{
int day;
int month;
int year;
}
class Date
{
int day;
int month;
int year;
string weekday;
string monthName;
public int GetDay()
{
return day;
}
public int GetMonth()
{
return month;
}
public int GetYear()
{
return year;
}
public void SetDay( int Day)
{
day = Day;
}
public void SetMonth( int Month)
{
month = Month;
}
public void SetYear( int Year)
{
year = Year;
}
public bool IsLeapYear()
{
return (year / 4 == 0 );
}
public void SetDate( int day, int month, int year)
{
}
}
-------------------
属性
-------------------
如果你熟悉C ++ 面象对象的方式,你就一定有一个属性的概念。在上面示例当中,以C ++ 的观点来看,Data类的属性就是day、month和year。用C#方式,你可以把它们写成Get和Set方法。C#提供了一个更方便、简单、直接的方式来访问属性。
因此上面的类可以被写成:
using System;
class Date
{
public int Day {
get {
return day;
}
set {
http://www.cnblogs.com/Images/OutliningIndicators/InBloc
发表评论
评论