C#基本语法总结
一、类型推断(type inference):var
编译器可以根据变量的初始化推断变量的类型
int someNumber = 0;
var someNumber = 0;
规则:
1、变量必须初始化;2、初始化器不能为空;3、初始化器必须放在表达式中;4、不能把初始化器设置为一个对象,除非在初始人器中创建了一个新对象
声明了变量,推断了类型后,就不能改变变量的类型。若要改变就要遵循强类型转换规则。
二、字段和局部变量的作用域冲突
c#把在类型级别声明的变量看作字段,而把在方法中声明的变量看作局部变量。
要引用类级变量则用语法object.fieldname,
例1:
using System;namespace Wrox{class ScopeTest{static int j = 100;public static void main(){int i = 30;Console.WriteLine(i); //30Console.WriteLine(ScopeTest.j); //100}}}
例2:
string text ;for (int index = 0; index < 10; index++ ){text = "line" + Convert.ToString(index);Console.WriteLine("{0}", text);}Console.WriteLine("last {0}", text);上面代码Console.WriteLine("last {0}", text);会出现错误,要对text进行赋值才能正确执行string text = ""; //string text = null;
三、常量
const ing a = 100;
特点有:
常量必须在声明是初始化常量的值必须能在编译时用于计算,因此不能从一个变量中提取的值来初始化常量常量总是静态的由于使用易于读到的名称替代了较难读取的数字或字符串,常量使程序变得更易于阅读常量使程序更易于修改常量更容易避免程序出现错误
四、预定义数据类型
1、值类型和引用类型
c#把数据类型分为两种:值类型和引用类型
从概念上讲,值类型直接存储其值,而引用类型存储对值的引用。这两种存储的内存的不同地方:值类型存储在堆栈中,而引用类型存储在托管堆上。
(类比C++,这个语法更类似于引用,而不是指针。我们使用.(句点)符号而不是用->来访问对象成员。在语法上,c#引用看起来更类似于C++引用变量。但是抛开表面的语法,实际上它更类似于c++指针。???)
2、CTS类型
c#认可的基本预定义类型并没有内置于c#语言中,而是内置于,NET Framework中。
c#有15个预定义类型其中有13个是值类型,两个是引用类型(object和string)
2.1、整型在C#中,int总是32位带符号的整数,而在c++中,int是带符号的整数,但其位数取决于平台。c#中所有的数据类型都以平台无关的方式定义,以备将来c#和.NET迁移到其他平台上。byte是0~255的标准8位类型,(c#认为byte类型和char类型完全不同,它们之间的转换必须显式写出)2.2、bool类型c#的bool类型用于包含布尔值true/false。而不是用0表示false,非0是true。2.3、string类型
2.3.1、string 是一个引用类型,String对象被分配在堆上,而不是栈上。string s1 = "abc";string s2 = s1;s1 = "abccba";ConsoleWrite(s1); //abccbaConsoleWrite(s2); //123以上s1改变了而对S2并没有影响,是因为当初始化s1时,就在堆上分配了一个新的sting对象。在初始化s2时引用也指向这个对象。但当s1改变时,并不会替换原来的值,堆上会为新值分配一个新对象。s2扔然指向原来的对象。这实际上是运算符重载的结果。2.3.2、字符串字面值"C:\\Temp\\" 等价于 @"C:\Temp\"2.3.3、其它string myString = "udbful zzg";
char myChar = myString[0]; //不能用这种方式为各个字符串赋值
char[] myChars = myString.ToCharArray(); //用这个就解决了为各个字符串赋值了
常用函数还有:
ToLower();
TOUpper();
Trim(); //删除指定字符
TrimStart(); TrimEnd();
PadLeft(); PadRight();
Split();
2.4、object 类型在c#中,object 类型就是最终 父类型,所有内置类型和用户定义的类型都从它派生而来。原因有两:
可以使用object引用绑定任何子类型的对象;object类型执行许多一般用途的基本方法
附:表达式的溢出检查:checked(expression)unchecked(expression)设置方法:properties->Build->Advanced(高级)->chenk for arithmetic overflow/unflow
五、流控制
1、switch语句
case的值必须是常量表达式,不允许使用变量。
c#的switch... case语句比c++更安全。特别是它禁止几乎所有case中的失败条件,如果激活了块中靠前的一条case子句,后面的case子句主不会被激活,除非使用goto语句。编译器会把没有break 语句的case子句标记为错误。
但用一种情况例外,如果一条case子句为空,就可以从这个case跳到下一条case上。
例:
case 1:case 2:case 3:a= 1;break;
2、foreach循环(以后增加)
foreach (<baseType><name> in <array>)
{
}//can use <name> for each element
如:
string friendNames = {"abc", "123", "000"};foreach(string name in friendNames){Console.WriteLine(name);}
六、枚举
enum<typeName>
{
<value>,
}
<typeName> <varName> //声明新类型变量
<varName>=<typeName>.<value> //赋值
默认情况是int,也可改成其它类型
enum<typeName> : <underlyingType>
...
创建枚举右以节省大量时间,减少许多麻烦,其优点有:
可以使代码更易于维护
枚举使代码更清晰
枚举也使代码更易于键入
在c#中,枚举的真正强大之处是它们在后邓中佳 实例化为派生于基类的结构。这表示可以对它们调用方法,执行有用的任务。
例:
public enum TimeOfDay{Morning = 0,Afternoon = 1,Evening = 2}获取枚举的字符串表示:TimeOfDay time = TimeOfDay.Afternoon;Console.WriteLine(time.ToString()); //Afternoon从字符串中获取枚举值TimeOfDay time2 = (TimeOfDay) Enum.Parse(typeof(TimeOfDay), "afternoon", true);Console.WriteLine((int)time2); //
七、数组
1、声明
<baseType>[] <name>; //int [] array;<baseType>[, , ] <name>; //多维
2、初始化
2.1 以字面形式指定数组的完整内容 //int[] array = {1,2,3}; //大小确定了2.2 先指定大小,再用new初始化所有数组元素 //int[] array = new int[5];3、数组的数组2.3 2.1和2.2的结全使用 //int[] array = new int[5] {1,2,3,4,5}; //大小要写赋值一至大小<baseType>[][] array; //声明
array = new int[2][]; //初始化方法一
array[0] = new int[3];
array[1] = new int[4];
array = new int[3][] = {new int[] {1,2,3}, new int[] {1}, new int[] {1,2}}; //初始化方法二
int [][] array = {new int[] {1,2,3}, new int[] {1}, new int[] {1,2}}; //初始化方法三
八、参数:
1、参数数组
使用关键字 params可以使用不定参数
static <returnType> <functionName> (<p1Type> <p1Name>, ... , params <type>[] <name>)
如:
static int SumVals(params int[] vals)
{
int sum = 0;
foreach(int val in vals)
{
sum += val;
}
return sum;
}
调用:sum = SumVals(1, 5, 10, 34);
2、引用参数与输出参数:
引用使用关键字ref,输出参数使用关键字out
static void fun(ref int val)
附:传入参数是变量不能为常量,其次必须初始化过的变量。
out 的执行方式与引用完全一样但有以下不同:
1、把未赋值给引用是非法,但可以把未赋初始化的变量用作out参数
2、在函数使用out参数时,out参数必须看作是还未赋值
static void MaxValue(int[] array, out int maxIndex)
{
int maxValue = array[0];
maxIndex = 0;
for (int index = 1; index < array.Length; index++)
{
if (array[index] > maxValue)
{
maxValue = array[index];
maxIndex = index;
}
}
}
调用方式: MaxValue(array, out maxIndex);
九、名称空间(以后再加)
名称空间提供了一种组织相关类和其他类型的方式。与文件或组件不同,名称空间是一种逻组合,而不是物理组合。
十、控制台I/O
Console.ReadLine(); //读输入Console.Write();Console.WriteLine(); //写输出Console.ReadKey(); //等待键盘Console.WriteLine("{0} plus {1} equals {2}", i, j, i+j);Console.WriteLine("{0, 4}\n + {1, 4}\n -------\n {2, 4}", i, j, i+j);使用占位符来代替这些格式字符串double d = 0.2345;Console.WriteLine("{0:#.00}", d); //.23
十一、c#预处理器指令(以后加增)
1、#define/#undef
2、#if/#elif/#else/#endif
3、#warning/#error
4、#region/#endregion
5、#line
6、#pragma
十二、关于调试
debug->windows下有Watch/Locals/Immediate/Command常用调试方法,好用
对于Command不知道怎么用,只有用>cmd通过Immediate转到Command
用immed则转回Immediate
十三、异常
try...catch...finally
try{}catch (<exception> e){}finally{}
可以只有try finally块,而没有catch。或者有一个try块和好几个catch,如果有一个或多个catch块,则finally块就是可选的,否则就是必需的。
throw
十四、c#编程规则
1、变量命名规则:
变量名的第一个字符必须是字母、下划线、或@其后的字符可以是字母、下划线或数字
2、命名约定
许多情况下名称都应使用Pascal大小写形式(如:EmployeeSalary)
名称空间、类、基类中的成员等都应遵循这规则,
在c#常量也不用全部都用大小,Pascal方法命名。如:const int MaximumLength;
另一种大小写模式camel大小写形式(如:employeeSalary)
以下三种情况可以使用camel大小写形式
类型中所有私有成员字段的名称都应是camel大小写形式
private int subId;
传递给方法的所有参数的名称都应是camel大小写形式
public void Fun(string salesmanName, int quantity)
camel大小写形式也可以用于区分同名的两个对象----比较常见的情况是属性封装一个字段
private string employeeName;
public string EmployeeName
{
get
{
return employeeName;
}
}
浙公网安备 33010602011771号