变量:
a) 在C#中,经过初始化的变量才能被调用
b) 变量在类或结构中成为字段,如果没有显示的对字段进行初始化,它的默认值是0
c) 变量在方法中,称为局部变量,必须在代码中显示的进行初始化,之后才能被调用
变量的作用域:
a) 只要字段所属的作用域在某个作用域内,那么该字段或成员变量也在该作用域内
b) 局部变量存在于表示声明该变量的块语句结束的封闭花括号之前的作用域内
c) 在For、while或类似语句中声明的局部变量,其作用域在该循环体内
常量:(Const 关键字)
a) 必须在声明时初始化
b) 其值必须能在编译时用于计算
c) 常量总是静态的
预定义数据类型:
a) 值类型直接存储其值,引用类型存储对值的引用
b) 值类型存在堆栈中,引用类型存储在托管堆上
c) // I and j both are int type
//Int 是值类型,这表示这两条语句会在内存的两个地方存储值20
Int I=20;j=I;
d) //x and y both are references
x=new mathtest();
x.value=30;
y=x;
console.writeline(y.value);
y.value=40;
console.writeline(x.value);
如上所示,因为x和y 是类这个引用类型的对象,且他们引用相同的对象,所以对y所做的修改会影响x,反之亦然。执行这段代码后,只有一个mathtest对象,x和y都指向包含该对象的内存地址,并且声明这两个变量,只是保留了一个引用,而不会实例化给定类型的对象
若变量是一个引用,就可以把它的值设为null确定它不引用任何对象
预定义值类型:
bool -> System.Boolean (布尔型,其值为 true 或者 false)
char -> System.Char (字符型,占有两个字节,表示 1 个 Unicode 字符)
byte -> System.Byte (字节型,占 1 字节,表示 8 位正整数,范围 0 ~ 255)
sbyte -> System.SByte (带符号字节型,占 1 字节,表示 8 位整数,范围 -128 ~ 127)
ushort ->System.UInt16 (无符号短整型,占 2 字节,表示 16 位正整数,范围 0 ~ 65,535)
uint -> System.UInt32 (无符号整型,占 4 字节,表示 32 位正整数,范围 0 ~ 2^32-1)
ulong -> System.UInt64 (无符号长整型,占 8 字节,表示 64 位正整数,范围 0 ~ 2^64-1)
short -> System.Int16 (短整型,占 2 字节,表示 16 位整数,范围 -32,768 ~ 32,767)
int -> System.Int32 (整型,占4字节,表示 32 位整数,范围-2^31到2^31-1)
long -> System.Int64 (长整型,占 8 字节,表示 64 位整数,范围-2^63到2^63-1)
float -> System.Single (单精度浮点型,占 4 个字节)
double -> System.Double (双精度浮点型,占 8 个字节)
decimal ->System.Decimal(128位高精度十进制表示法占16字节)
a)C#支持8到64位有符号和无符号的整数。C++的char表示一个8位字符,而C#的char包含16位,其中一部分是不允许在char类型与8位byte类型之间进行隐式转换的,char类型的字面量是用单引号引起来表示的如‘A’。char和byte之间进行类型转换必须显示进行
b)在声明变量的时候,如果对于一个整数是int,uint,long,ulong没有任何的显示声明,那么该变量默认为int,为了把键入的值指定为其他整数的类型,可如下操作:
a) 在C#中,经过初始化的变量才能被调用
b) 变量在类或结构中成为字段,如果没有显示的对字段进行初始化,它的默认值是0
c) 变量在方法中,称为局部变量,必须在代码中显示的进行初始化,之后才能被调用
变量的作用域:
a) 只要字段所属的作用域在某个作用域内,那么该字段或成员变量也在该作用域内
b) 局部变量存在于表示声明该变量的块语句结束的封闭花括号之前的作用域内
c) 在For、while或类似语句中声明的局部变量,其作用域在该循环体内
常量:(Const 关键字)
a) 必须在声明时初始化
b) 其值必须能在编译时用于计算
c) 常量总是静态的
预定义数据类型:
a) 值类型直接存储其值,引用类型存储对值的引用
b) 值类型存在堆栈中,引用类型存储在托管堆上
c) // I and j both are int type
//Int 是值类型,这表示这两条语句会在内存的两个地方存储值20
Int I=20;j=I;
d) //x and y both are references
x=new mathtest();
x.value=30;
y=x;
console.writeline(y.value);
y.value=40;
console.writeline(x.value);
如上所示,因为x和y 是类这个引用类型的对象,且他们引用相同的对象,所以对y所做的修改会影响x,反之亦然。执行这段代码后,只有一个mathtest对象,x和y都指向包含该对象的内存地址,并且声明这两个变量,只是保留了一个引用,而不会实例化给定类型的对象
若变量是一个引用,就可以把它的值设为null确定它不引用任何对象
预定义值类型:
bool -> System.Boolean (布尔型,其值为 true 或者 false)
char -> System.Char (字符型,占有两个字节,表示 1 个 Unicode 字符)
byte -> System.Byte (字节型,占 1 字节,表示 8 位正整数,范围 0 ~ 255)
sbyte -> System.SByte (带符号字节型,占 1 字节,表示 8 位整数,范围 -128 ~ 127)
ushort ->System.UInt16 (无符号短整型,占 2 字节,表示 16 位正整数,范围 0 ~ 65,535)
uint -> System.UInt32 (无符号整型,占 4 字节,表示 32 位正整数,范围 0 ~ 2^32-1)
ulong -> System.UInt64 (无符号长整型,占 8 字节,表示 64 位正整数,范围 0 ~ 2^64-1)
short -> System.Int16 (短整型,占 2 字节,表示 16 位整数,范围 -32,768 ~ 32,767)
int -> System.Int32 (整型,占4字节,表示 32 位整数,范围-2^31到2^31-1)
long -> System.Int64 (长整型,占 8 字节,表示 64 位整数,范围-2^63到2^63-1)
float -> System.Single (单精度浮点型,占 4 个字节)
double -> System.Double (双精度浮点型,占 8 个字节)
decimal ->System.Decimal(128位高精度十进制表示法占16字节)
a)C#支持8到64位有符号和无符号的整数。C++的char表示一个8位字符,而C#的char包含16位,其中一部分是不允许在char类型与8位byte类型之间进行隐式转换的,char类型的字面量是用单引号引起来表示的如‘A’。char和byte之间进行类型转换必须显示进行
b)在声明变量的时候,如果对于一个整数是int,uint,long,ulong没有任何的显示声明,那么该变量默认为int,为了把键入的值指定为其他整数的类型,可如下操作:
Uint a = 1234u;long b = 1234L;ulong c = 1234uL;
c)在声明变量的时候,没有对某个非整数硬编码,则编译器一般假定该变量是double,如果要指定float,则:
c)在声明变量的时候,没有对某个非整数硬编码,则编译器一般假定该变量是double,如果要指定float,则:
Float a = 12.34F;
d)若要把变量制定为decimal类型,则:
d)若要把变量制定为decimal类型,则:
Decimal d = 12.34M;
e)Bool值和整数值不能相互转换,若试图用0表示false,非0值表示true就会报错
预定义引用类型:
a)Object->system.object->根类型,CTS中的其他类型都是从他派生而来,包括值类型
b)String->system.string->string 对象保留在堆上而不是堆栈上,因此,当把一个字符串变量赋给另一个字符串,会得到对内存空间中同一个字符串的两个引用,然后修改其中一个字符串,注意这会创建一个全新的string对象,而另一个字符串不会受到影响
Using system;
Namespace stringexample
Class stringexample
{
Public static void main()
{
String str1=“this is a string”;
String str2=str1;
Console.writeline(“str1 is”+str1);
Console.wtireline(“str2 is”+str2);
Str1=”this is second string”;
Console.wtiteline(“str1 is”+str1);
Console.writeline(“str2 is”+str2);
}
}
转移序列:
/’ 单引号
/” 双引号
// 反斜杠
/0 空
/a 警告
/b 退格
/f 换页
/n 换行
/r 回车
/t 水平制表符
/v 垂直制表符
由于这些转义序列都是以反斜杠开头,所以字符串中就不能使用这个非转义的反斜杠字符,而需要对它进行转义,考虑如下:
String filepath=“C://procsharp//first.cs”;
C#还提供了另一种替代方式,可以在字符串字面两前面加上@,在这个字符后边的所有字符串都看作是其原来的含义,它们不会解释为转义字符
String filepath=@”C:/procsharp/first.cs”;
e)Bool值和整数值不能相互转换,若试图用0表示false,非0值表示true就会报错
预定义引用类型:
a)Object->system.object->根类型,CTS中的其他类型都是从他派生而来,包括值类型
b)String->system.string->string 对象保留在堆上而不是堆栈上,因此,当把一个字符串变量赋给另一个字符串,会得到对内存空间中同一个字符串的两个引用,然后修改其中一个字符串,注意这会创建一个全新的string对象,而另一个字符串不会受到影响
Using system;
Namespace stringexample
Class stringexample
{
Public static void main()
{
String str1=“this is a string”;
String str2=str1;
Console.writeline(“str1 is”+str1);
Console.wtireline(“str2 is”+str2);
Str1=”this is second string”;
Console.wtiteline(“str1 is”+str1);
Console.writeline(“str2 is”+str2);
}
}
转移序列:
/’ 单引号
/” 双引号
// 反斜杠
/0 空
/a 警告
/b 退格
/f 换页
/n 换行
/r 回车
/t 水平制表符
/v 垂直制表符
由于这些转义序列都是以反斜杠开头,所以字符串中就不能使用这个非转义的反斜杠字符,而需要对它进行转义,考虑如下:
String filepath=“C://procsharp//first.cs”;
C#还提供了另一种替代方式,可以在字符串字面两前面加上@,在这个字符后边的所有字符串都看作是其原来的含义,它们不会解释为转义字符
String filepath=@”C:/procsharp/first.cs”;
流控制
1. 条件语句:根据表达式的值,控制代码执行的分支
If(condition)
{
Statements
}
Else
{
Statements
}
也可以结合else if 语句,测试多个条件
If(conditon)
{
Statements
}
Else if(condition)
{
Statements
}
Else if
{
Statements
}
Else if
……
添加到if语句块中的else if 个数没有限制
需要注意的一点是:
If 语句中的测试的condition值,必须是boolean值
2. Switch语句
Switch…case 语句适合于从一组不同的分之中选一个来执行,其形式是switch参数的后面根一组case子句,如果switch参数中表达式等于某个case子句的值,那么便执行该case子句中的代,无需大括号把语句块组合起来,只需要用break关键字标记每个case代码结束即可,也可以在wsitch语句中,包含一个default子句,如果表达式不等于其他case子句的值,就执行default子句的代码
注意:case子句的值必须是常量表达式,不允许使用变量
这里需要记得,一个异常情况,如果一个case为空,那么就可以从这个case跳到下一个case上,这样就可以用相同的方式对待两个或多个case子句了
Sample:
Switch(country)
{
Case”au”:
Case”uk”:
Case”us”:
Language=”english”;
Break;
Case”at”:
Case”de”:
Language=”german”;
Break;
}
Case的顺序无关紧要,可以把default子句放到最前面,任何两个case的子句都不能相同,包括值相同的不同常量,这里还要注意区别去C++的一点,可以把string作为测试的变量
循环:
预测式循环:
//计算表达式;测试表达式;迭代后计算表达式
For(initializer;condition;iterator)
{
Statements;
}
所谓预测式循环,即循环条件是在执行循环语句之前计算的,若循环条件为假,那么循环语句根本不会执行
嵌套的For循环很常见,本人认为这才是这个知识点的难点所在,但未必深奥,只需要记住一句话:每次迭代外部循环时,内部循环要彻底执行完毕,ok
Sample:
//根据上边这句话,不妨手写下面这段code的结果
Using system;
Name space abc
{
Class abc
{
Static void main(string[]args)
{
For (int i=0;i<100;i+=10)
{
For (int j=I;i<i+10;j++)
{
Console.writeline(“ ”+j);
}
Console.writeline();
……
简单解析:这种模式通常用于遍历矩形数组中的每个元素,最外部的循环遍历每行,内部的循环遍历某行上的每列,ok
注意:for循环中,可以忽略一个表达式,甚至所有表达式
While循环:
常用于这种情况:在循环开始之前,不知道应该循环的次数,通常在某次迭代中,while循环体中的语句把bollean值改为false,则循环相继结束
Sample:
Bool condition=false;
While(!condition)
{
Statements;
Condition=check(condition);
}
Do…while循环:
这个可以认为是while循环的后测试版本,该循环的测试条件要在执行完毕循环体之后执行,也就是说这个循环至少执行一次循环体,ok
Boll condition;
Do
{
Statements;
}
While(condition)
Foreach循环:
用于迭代集合中的每个项目,ok
Sample:
Foreach(int temp in arrayofints)
{
Console.writeline(temp);
}
这里需要注意一点就是:不能改变结合中各个项目的值
若:
Foreach(int temp in arrayofints)
{
temp++;
console.writeline(temp);
}
这样的代码就不会被编译,若要迭代并改变结合中项目的值,用for循环即可,ok
控制流不可能离开的两个关键字:
Break:在switch语句中使用他退出某个case语句,在for、foreach、while或do…while循环中,用于退出循环,之后立即执行后面的语句
Continue:类似于break语句,但是他只是从循环的当前迭代中退出,然后继续下一次迭代,而不是完全退出循环,ok