前些时间因为出差所以中断了一段时间﹐也来了不少新的群友﹐如果你还是初学者﹐请看看我前面的讲课内容﹐每一讲的内容都是按步就班的﹐希望你能有一些连贯﹐关于C#我用的时间也不是很久﹐不可能面面了解﹐但是综合我几年的经验和近期的学习﹐本讲主要针对搜集的资料以及的看法﹐中间不免遗漏的错误。
请先把窗口最大化﹐期间请不要闲谈﹐如果不是觉得很必要的问题请在我讲完以后问我﹐使得我讲课有一个连贯性。
C#语言
在C#产生以前微软的主要开发语言是C/C++﹐C/C++相当灵活但是非常容易出错﹐开发周期长﹐效率不高。
因此推出了C#﹐它的优点比较多﹐ 象VB一样简单﹐又象C++样强大﹐还有些象Java﹐C#是微软在研究了C C++ Java SmallTalk等语言的基础上推出的新语言(官方引用)﹐与Java比较C#更接近于C++﹐也引入了一些新概念﹐它是面向组件的语言。
C#是为了使用和支持基于组件编程而特别设计的﹐.NET架构中的多数内容是C#语言编写的(请住这一点)﹐你可以认为C#是微软下一代平台开发语言﹐C#是C++的发展﹐也是对Java的抗衡(虽然微软口口声声说不是)。
C#的特点可以概括为﹕语法简单﹑功能强大﹑面向对象﹑安全可靠﹑版本控制﹑兼容性强
1)语法简单
C#的首要目标就是语法简单(当然是针对C++来说)﹐C#中谨慎的使用指针﹐基本以引用取代。用过C++都知道”::”﹑”->”操作符吧﹐C#都没有使用﹐在C#里开发者不用记住基于不同处理器架构的隐含的类型﹐象整型的变化范围等﹐你可以通过同时学习C#和C++做比较。
2)功能强大
例如套接字﹐金融数据类型都体现着它的强大。这一点不多说了。
3)面向对象
封装﹑继承﹑多态﹐听说过这些概念吧﹐有关这方面的东西也不介绍了﹐以后专门开一讲
4)安全可靠
C#有严格的类型安全﹐你不能使用没有初试化的变量﹐对于对象的的成员变量﹐编译器会自动清零﹐而对于局部变量需要编程者去做﹐避免了使用未经初始化的变量而造成的”奇怪”错误。
5)版本控制
去看看DLL HELL是什幺就明白了。
6)兼容性强
C#允许使用CLS(Common Language Specification)通用语言规范访问不同的API﹐上次一位群友已经问到这个问题﹐主要是C#编译器会检测所有的公共出口编译﹐并有错误提示﹐CLR允许COM的透明访问﹐支持OLE自动化。
7)灵活机动
尽管C#代码的默认状态是类型安全的﹐但是你仍然可以声明一些类或者类的方法是非安全的。这样就可以使用指针﹑结构﹑静态地址分配数组
下面是C#和Java的一些比较
C# C++ Java
继承 允许单个继承﹐允许实现多接口 允许从多个类继承 允许单个继承﹐允许实现多接口
接口实现 通过Interface关键词 过抽象类 通过Interface关键词
内存管理 由运行时环境管理﹐垃圾收集器 手工管理 由运行时环境管理﹐垃圾收集器
指针 支持﹐但只在很少非安全模式下 支持﹐常用功能 完全不支持﹐代之以引用
才支持﹐通常以引用取代指针
代码编译后 .NET中间语言(IL) 可执行代码 字节码
单一公共基类 是 否 是
异常处理 异常处理 返回错误 异常处理
C#面向对象程度比Java高﹐C#中的基本类型都是基于类的﹐如int.Int32 Int32是系统提供的一个类﹐ int基本类型就映像为类int32;C#具有比Java更强大的功能﹐C#拥有Vb的快速开发的便利和C++的强大特点﹐C#有极大的兼容性﹐可以用C#调用已有的VB,C/C++, COM和VBX﹐几乎是微软所有产品的总接口;C#比Java速度快﹐为了跨平台C#也采用了JIT译器﹐并使得JIT发展和提升﹐所以C#的执行速度快。
我不想比较哪种语言的优劣﹐但是可以肯定C#是.NET平台上最好的开发语言。
C#语法介绍
1数据类型和变量
1.1数据类型
数据类型主要分为两类﹐值类型和引用(地址)类型(还包括不安全的指针类型)﹐它们之间的区别是﹐值类型的变量直接包含数据﹐而引用类型的变量包含的对象的引用(地址)。
1.1.1 值类型
所有的值类型都是从类Object中继承来的﹐没用任何值类型是从值类型继承来的﹐值类型的变量总是包含该类型的数值。
1.1.1 .1值类型的默认值
所有的值类型都有默认的构造器
l sbyte,byte,short,ushort,int,uint,long,ulong : 0
l Char : /x0000
l Float : 0.0f
l Double : 0.0d
l Decimal : 0.0m
l Bool : false
l 枚举 : 0
int i=0;和int i=new int();使得i变量都初始化为0
1.1.1 .2简单类型
C#提供的预定义的简单数据类型﹐目的就是可以执行一些特殊的简化和操作
保留字 别名
l sbyte : System.Sbyte
l byte : System.Byte
l short : System.Int16
l ushort : System.Uint16
l int : System.Int32
l uint : System.Uint32
l long : System.Int64
l ulong : System.Uint64
l char : System.Char
l float : System.Single
l double : System.Double
l bool : System.Boolen
l decimal : System.Decimal
int i=int.MaxValue; //System.Int32.MaxValue
1.1.1 .3整型类型
包括sbyte,byte,short,ushort,int,uint,long,unlong,char
整数类型的一元二元操作总是int,uint,long,unlong
对于一元操作+和~(取补)﹐操作转化类型为int,uint,long,unlong的首位(好似1+1.2 1要先变为浮点)
对于二元操作+,-,*,/,%,&,^,|,==,!=,>,<,>=,<=﹐操作作转化类型为int,uint,long,unlong的首位
对于二元操作>>,<<﹐左边的操作类型转换为int,uint,long,unlong的首位
(转换操作符 隐式转换()和显式转换())
请注意Char是整型类型﹐为16位无符号整数﹐但是它的常数必须写做文字符号﹐且没有到其它类型的转换
1.1.1 .4浮点类型
folat 32单精度和double 64为双精度
注意有正0和负0的区分﹐大多数情况都简单的表示为0
非数值为NaN﹐产生于非法的浮点操作
1.1.1 .5小数类型(金融类型)
128 位数据类型
注意不能进行和浮点类型的隐式转换
1.1.1 .6布尔类型
不存在和其它类型的转换函数
在C#中整数类型和0比较引用类型和null比较﹐不能把整数01认为是假真
1.1.1 .7枚举类型
枚举类型来自System.Enum﹐这里不展开了
1.1.2 引用类型
1.1.2 .1Class类型
含有数据成员(常数﹑域﹑事件)﹐函数成员(方法﹑构造﹑析构)﹐嵌套类型中的一种的数据结构﹐可以继承
1.1.2 .2Object
是所有其它类型的基类型﹐C#中所有的数据类型都是直接或间接从Object继承来的
1.1.2 .3string类型
它是直接从Object继承而来的封装类﹐string 类的实例代表了Unicode字符串
注意string是一个引用类型﹐必须初始化才能使用
string str;
str.Replcae(“a”,”aa”);是错误的
int i;
i.toString();是正确的
1.1.2 .4接口类型
接口定义了一种协议﹐执行此口的类或结构必须服从协议﹐这点以后会单独开讲
1.1.2 .5数组
数组的类型值可以是空值或者指向另一数组的实例﹐数组中的元素类型是任意的﹐数组的类型也是任意的。
数组的匹配﹐不能扩展到数值类型的数组﹐不能把int[]当成Object[]
数组的初始化﹐可以有多种形式﹐域声明﹑局部变量声明﹑数组生成表达式
int[] a = {0,2,4,6,8};和int[] a = new int[]{0,2,4,6,8};是等价的
int[,] b = {{0,1},{1,2}};
int[,] b = new int[3,2];
当数组生成表达式包括直接的维数长度和数组的初始化时﹐长度必须是常数表达数
int i=3;
int[] a = new int[i]{0,1,2};这种声明是错误的﹐int[] a = new int[i];是对的
1.1.2 .6委托类型(Delegate)
是指向静态方法或者是对象实例以及对象实例方法的一种数据结构﹐有点象C++中的函数指针﹐但是区别很大
这点以后开讲
1.1.3 装箱(Boxing)和拆箱(Unboxing)
这是C#类型系统的核心﹐这种机智可以在值变量和引用变量之间建立联系﹐是两者可以互换﹐从而建立统一的系统类型。
int i=111;
object o = i; //隐式装箱
object o = object(i); //显式装箱, o is int 为真
int j = (int)o; //拆箱
1.2变量
变量代表存储地址﹐每个变量都有类型﹐决定存储什幺样的值和存储方式﹐C#是安全类型语言﹐一个变量的值在可以获取之前必须先分配地址﹐变量可以分为有初始值和没有初始值两种。
1.2.1 变量的种类
静态变量﹐static修饰符定义的变量﹐生存周期为从类的装载到卸载
实例变量﹐不包含static修饰符定义的变量,如public string str;
数组元素﹐数组中元素在数组创建时才存在﹐并且在引用没有指向数组实例时被终止
值变量﹐ 没有ref或out修饰符的变量
引用变量﹐有ref修饰符的变量是引用变量﹐引用变量不创建一个新的存储地址﹐它和调用的变量指向同一个地址﹐函数调用时候必须赋初始值﹐类似于C++的指针变量
输出变量﹐有out修饰符的变量是输出变量﹐输出变量不创建一个新的存储地址﹐它和调用的变量指向同一个地址﹐函数调用中候必须赋初始值﹐类似于C++的指针变量
局部变量﹐块语句中如for等的变量定义﹐它不会自动初始化
class a
{
public static int x; //静态变量
int y; //实例变量
void f(int[] v,int a, ref int b,out int c) //v[0]是数组元素﹐a是值变量﹐b是引用变量﹐c是输出变量
{ int i=1; //局部变量
c=a+b++;
}
}
1.2.2 默认值
值变量的默认值是类型默认构造器指定的值
引用变量的默认值是null
1.2.3 明确的赋值变量
static void f()
{
int i,j;
try
{i = 1;}
catch
{i = 1; j = 1;}
//i明确赋值而j没有
}
需初始化赋值变量
l 静态变量
l 类实例中的实例变量
l 初始化赋值的结构变量的实例变量
l 数组元素
l 值变量
l 引用变量
不许初始化赋值变量
l 结构变量的实例变量
l 输出变量
l 局部变量
2语句
2.1using
它可以得到一个或多个资源﹐执行一个语句﹐然后释放资源
using (R r1 = new R())
{r1.f();}
和下面是等价的
R r1 = new R();
try
{r1.f();}
finally
{if(r1 != null)((IDisposable)r1).Dispose();}
2.2goto
不建议使用
void f(int x)
{
if(x>0) goto x;
x=-x;
x:return x;
}
2.3声明语句
局部变量声明:int x = 1; ,局部常量声明: const int x = 1;
2.4选择语句
if﹑switch﹑
2.5循环语句
for﹑forearch﹑while﹑do while
2.6跳转语句
break﹑continue﹑goto﹑return﹑throw
2.7try
2.8checked﹑checked
用于控制整型类型的运算和转换的溢出检查﹐checked作用在块上﹐unchecked作用在表达式上
2.9lock
它获得一个给定对象的互斥锁﹐执行一个语句﹐然后释放这个锁
lock(...)
当于
try
{...}
finally
{System.Threading.Monitor.Exit(....);}
最后希望你能养成良好的变成习惯
在一个二元操作符的每一边都加一个空格 string c = new string();不要string c=new string();
在每一个逗号后面而不是前面加一个空格 void f(int i, int j) 不要f(int i,int j)
一行一个语句 哪怕分支语句内容只有一句也应使用{}
分号前不要有空格 string c = new string();不要string c = new string() ;
函数的园括号和参数之间不加空格 void f(int i, int j) 不要void f( int i,int j )
在一元操作符和操作数之间不加空格 i++;不要i ++;
区分大小写
字符值必须用单引号表示,字符串必须用双引号表示
char a = ‘c’; string c = “test”; string[] b = c.Split('*');
变量名不能以数字开头 int 0c ;是错误的