1.1 什么是.NET Framework
.NET Framework是Microsoft为开发应用程序创建的一个平台。通过它可以创建Windows应用程序、Web应用程序、Web服务和其他类型的应用程序。
1.2 .Net Framework的内容
.Net Framework主要包含一个非常大的代码库。它定义了一些基本类型,称为通用类型系统(Common Type System, CTS),它还包含了.NET 公共语言运行时(Common Language Runtime, LCR)它负责管理用.NET库开发的所有应用程序的执行。
1.3 什么是C#
C#是可用于创建要运行在.NET CLR上的应用程序语言之一。
1.4 执行程序
F5启动调试
Ctrl+F5 不调试,直接运行
1.5 简单数据类型
这些类型中的每一种都利用了.NET Framework中定义的标准类型。
在C#中这些类型的名称是.NET Framework中定义的别名。
(整数)
类型 | 别名 | 允许的值 |
sbyte | System.SByte | [-128, 127] |
byte | Syste.Byte | [0, 255] |
short | System.Int16 | [-32767, 32767] |
ushort | System.UInt16 | [0, 65535] |
int | System.Int32 | [-2147483648, 2147483647] |
uint | System.UInt32 | [0, 4294967295] |
long | System.Int64 | [-9223372036854775808, 9223372036854775807] |
ulong | System.UInt64 | [0, 18446744073709551615] |
(浮点数)
类型 | 别名 | 最小值 | 最大者 |
float | System.Single | 1.5*10(-45) | 3.4*10(38) |
double | System.Double | 5*10(-324) | 1.7*10(308) |
decimal | System.Decimal | 1.0*10(-28) | 7.9*10(28) |
除了数值类型外,还有三种简单数据类型:
类型 | 别名 | 允许的值 |
Char | System.Char | 一个Unicode字符,0-65535之间的整数 |
bool | System.Boolean | 布尔值:true或false |
string | System.String | 一组字符 |
1.6 变量的命名
基本的变量命名规则如下:
l 变量名的第一个字符必须是字母,下划线或者@
l 其后的字符可以是字母、下划线或数字
命名约定:
.NET Framework名称空间中有两种命名约定,称为PascalCase和camelCase
PasscalCase约定:名称中的每个单词除了第一个字母大写外,其余都是小写
camelCase约定:第一个单词以小写字母开头
1.7 字面值
类型 | 类别 | 后缀 | 范例/允许的值 |
Bool | 布尔 | 无 | true/false |
int,uint,long,ulong | 整数 | 无 | 100 |
uint,ulong | 整数 | u/U | 100U |
long ulong | 整数 | l/L | 100L |
ulong | 整数 | Ul,uL,Ul,UL,lu,lU,Lu,LU | 100UL |
float | 实数 | f/F | 1.5F |
double | 实数 | 无或d/D | 1.5 |
decimal | 实数 | m/M | 1.5M |
char | 字符 | 无 | ‘a’或转义序列 |
string | 字符串 | 无 | “a…” |
1.8 字符串的字面值
下表为可以在字符串的字面值中使用的转义序列
转义序列 | 产生的字符 | Unicode码 |
/’ | 单引号 | 0x0027 |
/” | 双引号 | 0x0022 |
// | 反斜杠 | 0x005C |
/0 | 空 | 0x0000 |
/a | 警告(响鸣) | 0x0007 |
/b | 退格 | 0x0008 |
/f | 换页 | 0x000C |
/n | 换回 | 0x000A |
/r | 回车 | 0x000D |
/t | 水平制表符 | 0x0009 |
/v | 垂直制表符 | 0x000B |
也可以逐字地指定字符串,即两个双引号之间的所有字符都包含在字符串中,包括行末字符和需要转义的字符。
如:”Karli/’s name”
@”Karli’s name”
1.9 变量声明和赋值
变量在使用前,必须被初始化,否则编译将出错。可以先定义变量然后赋值,也可以定义的时候就赋值。
2.0 数学运算符
有5个简单的数学运算符,其中2个有一元和二元两种形式。
运算符 | 类别 | 范例 | 结果 |
+ | 二元 | var1=var2+var3; | 求和后将结果赋值给var1 |
- | 二元 | var1=var2-var3; | 相减后将结果赋值给var1 |
* | 二元 | var1=var2*var3; | 相乘后将结果赋值给var1 |
/ | 二元 | var1=var2/var3; | 相除后将结果赋值给var1 |
% | 二元 | var1=var2%var3; | 求余后将结果赋值给var1 |
+ | 一元 | var1= +var2; | var1的值等于var2的值 |
- | 一元 | var1= -var2; | var1的值等于var2的值乘-1 |
递增递减运算符
运算符 | 类别 | 范例 | 结果 |
++ | 一元 | var1= ++var2; | var1的值是var2+1 var2递增1 |
-- | 一元 | var1= --var2; | var1的值是var2-1 var2递减1 |
++ | 一元 | var1= var2++; | var1的值是var2 var2递增1 |
-- | 一元 | var1= var2--; | var1的值是var2 var2递减1 |
赋值运算符
运算符 | 类别 | 范例 | 结果 |
= | 二元 | var1=var2; | var1被赋值为var2的值 |
+= | 二元 | var1+=var2; | var1 = var1 + var2; |
-= | 二元 | var1-=var2; | var1 = var1 – var2; |
*= | 二元 | var1*=var2; | var1 = var1 * var2; |
/= | 二元 | var1/=var2; | var1 = var1 / var2; |
%= | 二元 | var1%=var2; | var1 = var1 % var2; |
运算符优先级
优先级 | 运算符 |
优先级由高到低 | ++, --(用作前缀), +, -(一元) |
* , /, % | |
+, - | |
==, *=, /=, %=, +=, -= | |
++, --(用于后缀) |
流程控制
1. 布尔逻辑
六个比较运算符:== != < > <= >=
四个位运算符:& | ^ ~
四个布尔运算符:! & | ^
两个布尔运算符:&& ||
两组布尔运算符计算的结果一样。只是后者性能较好!作为一个规则,尽可能使用&&和||运算符。
2. 移位运算符
>> 右移操作符
<< 左移操作符
3. 布尔赋值运算符
&= |= ^=
4. 移位赋值运算符
>>= <<=
5. 运算符优先级
优先级 | 运算符 |
优先级由高到低 | ++,--(用作前缀),(),+,-(一元),!,~ |
*,/,% | |
+,- | |
<<,>> | |
<,>,<=,>= | |
==,!= | |
& | |
^ | |
| | |
&& | |
|| | |
=,*=,/=,%=,+=,-=,<<=,>>=,&=,^=,|= | |
++,--(用作后缀) |
6. 分支
C#提供三种分支技术:三元运算符、if语句、switch语句
switch语句和C++是有区别的,在C++中,可以运行完一个case后,运行另一个case语句。C#中每个case后必须有break语句,default后也需要用break语句。
不过这一规则可以有一个例外:如果把多个case语句放在一起(堆叠他们),如
switch(<testVar>)
{
case a:
case b:
…
break;
default:
…
break;
} 则只要条件满足a或者b都会执行b后面的语句。
7. 循环
do…while语句,while语句,for语句用法和C++一样。
变量的更多内容
1. 类型转换
a.隐式转换
b.显式转换
2. 枚举的定义:
enum typeName
{
value1,
value2,
value3…
valueN
}
接着声明这个新类型的变量:typeName varName;
并赋值:varName = typeName.value;
枚举使用一个基本类型类存储。默认情况下该类型为int。在枚举声明中添加类型,可以指定其他基本类型:
enum typeName : underlyingType
{
value1,
value2,
value3…
valueN
}
枚举的基本类型可以是byte,sbyte,short,ushort,int,uint,long,ulong
默认情况下,每个值会根据定义的顺序(从0开始)自动赋给对应的基本类型值。
要获得枚举变量的值,可以用显式类型转换
要获得枚举变量的字符串值,可以使用Convert.ToString()或者用变量本身的ToString()命令。
可以把string转换为枚举值,但语法较复杂:
(enumerationType)Enum.Parse(typeof(enumerationType), enumerationValueString);
例子:
string myString = “north”;
orientation myDirection = (orientation)Enum.Parse(typeof(orientation), myString);
3. 结构
使用struct关键字来定义
struct <typeName>
{
<memberDeclarations>
}
<memberDeclarations>部分包含变量的定义,格式与往常一样。每个成员的声明采用如下形式:
<accessibility> <type> <name>;
要让调用结构的代码访问该结构的数据成员,可以对accessibility使用关键字public
4. 数组
声明数组:
<baseType> [] <name>
其中<baseType>可以是任何变量类型,包括前面介绍的枚举和结构类型。
数组在访问前必须初始化。有两种方式可初始化数组:
int[] myIntArray = {5,9,10,2,88};
int[] myIntArrat = new int[5];
也可以使用非常理的变量来初始化:
int[] myIntArray = new int[arraySize];
还可以用两种初始化方式的组合:
int[] myIntArray = new int[5]{5,9,10,2,88};
使用这种方式,数组大小必须与元素个数匹配,不能编写如下代码:
int[] myIntArray = new int[10]{5,9,10,2,88};
如果这种组合方式用变量来定义大小,则会编译失败。大小必须用一个常量:
const int arraySize = 5;
int[] myIntArray = new int[arraySize[] {5,9,10,2,88};
用for each遍历数组元素的语法:
foreach(<baseType> <name> in <array>)
{
…
}
string[] friendsName = {“Robert Barwell”, “Mike Parry”, “Jeremy Beacock”};
foreach(string name in friendsName)
{
Console.writeLine(“Name is {0}”, name);
}
使用这种方法和标准for循环访问数组的区别是foreach循环对数组的内容是只读的,不能改变任何元素的值。