1.基本语法
1.1变量和表达式
基本类型:
整形:
有符号 | 无符号 |
sbyte | byte |
short | ushort |
int | uint |
long | ulong |
浮点型
类型 | 备注 | m取值范围 e取值范围 | 近似值 |
float | 0 <224 span -149 <104<> | 1.5 X 10-45 到 3.4 X 1038 | |
double | 0 <253 span -1075 <970<> | 5.0 X 10-324 到 1.7 X 10308 | |
decimal | 小数型 | 0 <296 span -26 <0<> | 1.0 X 10-28 到 7.9 X 1028 |
前两者可用+/- m x 2e的形式存储,decimal则是用+/- m x 10e存储
另外三种简单类型
类型 | 允许的值 |
char | 一个Unicode字符,用16位整形编码 |
bool | 真假 |
string | 一组字符 |
1.2命名空间
namespace LevelOne
{
int a;
namespace LevelTwo
{
//类似这样定义命名空间,C#中的所有代码一般都包含在命名空间中,包括Main函数(C#的Main首字母大写的哦,和C++不同)
}
}
namespace LevelOne2
{
//可以用"."运算符来调用其他命名空间中的东西
LevelOne.a=1;
//也可以用using语句,
using LevelOne;
a=1;
}
1.3运算符
运算符优先级:
组 | 运 算 符 |
初级运算符 | () . [] x++ x-- new typeof sizeof checked unchecked |
一元运算符 | + – ! ~ ++x --x和数据类型转换 |
乘/除运算符 | * / % |
加/减运算符 | + – |
移位运算符 | << >> |
关系运算符 | < > <= >= is as |
比较运算符 | = = != |
按位AND运算符 | & |
按位XOR运算符 | | |
按位OR运算符 | ^ |
布尔 AND运算符 | && |
布尔OR运算符 | || |
三元运算符 | ?: |
赋值运算符 | = += –= *= /= %= &= |= ^= <<= >>= >>>= |
从上表可以看到所有C#的运算符,大部分与C++相同,这里介绍几个不同的
checked和unchecked运算符
C#提供了checked和 unchecked运算符。如果把一个代码块标记为checked,CLR就会执行溢出检查,如果发生溢出,就抛出异常。如果改变代码,使之包含checked运算符:
byte b = 255;
checked
{
b++;
}
Console.WriteLine(b.ToString());
运行这段代码,就会得到一个错误信息:
Unhandled Exception: System.OverflowException: Arithmetic operation resulted in an overflow.
at Wrox.ProCSharp.Basics.OverflowTest.Main(String[] args)
如果要禁止溢出检查,可以把代码标记为unchecked:
byte b = 255;
unchecked
{
b++;
}
Console.WriteLine(b.ToString());
注意,unchecked是默认值。只有在需要把几个未检查的代码行放在一个明确标记为checked的大代码块中,才需要显式使用unchecked关键字。
is运算符
is运算符可以检查对象是否与特定的类型兼容。例如,要检查变量是否与object类型兼容:
注意:
"兼容"表示对象是该类型,或者派生于该类型。
int i = 10;
if (i is object)
{
Console.WriteLine("i is an object");
}
int和从object继承而来的其他C#数据类型一样,表达式i is object将得到true,并显示信息。
as运算符
as运算符用于执行引用类型的显式类型转换。如果要转换的类型与指定的类型兼容,转换就会成功进行;如果类型不兼容,as运算符就会返回值null。如下面的代码所示,如果object引用不指向string实例,把object引用转换为string就会返回null:
object o1 = "Some String";
object o2 = 5;
string s1 = o1 as string; //s1 = "Some String"
string s2 = o2 as string; //s1 = null
as运算符允许在一步中进行安全的类型转换,不需要先使用is运算符测试类型,再执行转换。
sizeof运算符
使用sizeof运算符可以确定堆栈中值类型需要的长度(单位是字节):
unsafe
{
Console.WriteLine(sizeof(int));
}
其结果是显示数字4,因为int有4个字节。
注意,只能在不安全的代码中使用sizeof运算符。第7章将详细论述不安全的代码。
typeof运算符
typeof运算符返回一个表示特定类型的System.Type对象。例如,typeof(string)返回表示System.String类型的Type对象。
可空类型运算符
如果在程序中使用可空类型,就必须考虑null值在与各种运算符一起使用时的影响。通常可空类型与一元或二元运算符一起使用时,如果其中一个操作数或两个操作数都是null,其结果就是null。例如:
int? a = null;
int? b = a + 4; // b = null
int? c = a * 5; // c = null
但是在比较可空类型时,只要有一个操作数是null,比较的结果就是false。即不能因为一个条件是false,就认为该条件的对立面是true,这在使用非可空类型的程序中很常见。例如:
int? a = null;
int? b = -5;
if (a >= b)
System.Console.WriteLine("a >= b");
else
System.Console.WriteLine("a < b");
空接合运算符
空 接合运算符(??)为处理可空类型和引用类型时表示Null值的可能性提供了一种快捷方式。这个运算符放在两个操作数之间,第一个操作数必须是一个可空类 型或引用类型,第二个操作数必须与第一个操作数的类型相同,或者可以隐含地转换为第一个操作数的类型。空接合运算符的计算如下:如果第一个操作数不是 null,则整个表达式就等于第一个操作数的值。但如果第一个操作数是null,则整个表达式就等于第二个操作数的值。例如:
int? a = null;
int b;
b = a ?? 10; // b has the value 10
a = 3;
b = a ?? 10; // b has the value 3
如果第二个操作数不能隐含地转换为第一个操作数的类型,就生成一个编译错误
详细查询运算符可登陆http://msdn2.microsoft.com/zh-cn/library/6a71f45d(VS.80).aspx
查询
1.5数组、结构和枚举
数组
定义格式:
int[] 数组名
数组要在访问之前初始化。
例如:
int[] Array={1,3};
或者
int[] Array=new int[2];
或者
int[] Array;
Array=new int[2];
结构体:和C++一样
枚举 :和C++一样
enum typeName{value1,value2,value3}
1.5选择及循环语句
选择语句:if else和switch
int caseSwitch = 1;
switch (caseSwitch)
{
case 1:
Console.WriteLine("Case 1");
break;
case 2:
Console.WriteLine("Case 2");
break;
default:
Console.WriteLine("Default case");
break;
}
http://msdn2.microsoft.com/zh-cn/library/06tc147t(VS.80).aspx
循环语句:for, while, do…while和 foreach
前三个和C++一样,就不讲了,下面介绍下foreach,可以用于从集合中逐一选取元素进行循环
class ForEachTest
{
static void Main(string[] args)
{
int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 };
foreach (int i in fibarray)
{//用in关键字加在集合前
System.Console.WriteLine(i);
}
}
}
集合可以是数组,枚举型等等~
2.函数
函数的定义和使用基本上和C++相同,其重载方式在讲到类的时候再说。
注意的是参数中,C++的&符号代表引用而在C#
2.1委托
委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的调用可以像其他任何方法一样,具有参数和返回值,如下面的示例所示:
public delegate int PerformCalculation(int x, int y);
delegate是定义委托的关键字
-
委托类似于 C++ 函数指针,但它们是类型安全的。
-
委托允许将方法作为参数进行传递。
-
委托可用于定义回调方法。
-
委托可以链接在一起;例如,可以对一个事件调用多个方法。
using System;
// 声明一个委托:
delegate void SampleDelegate(string message);
class MainClass
{
// 一个普通的函数:
static void SampleDelegateMethod(string message)
{
Console.Write(message);
}
static void Main()
{
// 建立一个委托实例d1并将函数SampleDelegateMethod赋值给它:
SampleDelegate d1 = SampleDelegateMethod;
// 运行委托 d1:
d1("Hello");
}
}
可以把它理解成函数指针那样~