常量
const 类型名 变量名 = 数值; 在定义时赋值,其他地方不能赋值。
枚举
定义一种枚举类型,并且在定义这种类型是要指定这个类型的所有值。
语法: enum 自己起的类型名 { 写我们这种类型都有哪些值 值1,值2,... ,值n}
枚举的定义一般和类定义在用一个级别,这样这个命名空间下所有的类都能使用。方法中、类中也可以。
作用 : 1 限制用户不能随意赋值,只能在定义的枚举值中选择;2 不用死记值,用 . 选择值;
定义枚举是,值不能是int类型
枚举类型都可以强制转换为int 类型;枚举值在定义的时候已经默认有值,编号从0开始;也可以把第一个定义为其他值,后面值递增1;
如何把一个字符串转化为一个枚举类型
(自己定义的枚举类型) (Enum.Parse(typeof(自己定义的枚举类型),"待转换的字符串");
命名参数 : 只要显示指定参数的名字就可以图任意顺序在方法调用中列出实参
调用的时候可以既有位置参数也有命名参数,但在这种情况下位置参数要先列出。
public int calc(int a, int b, int c)
{
....
}
int r0 = calc(4,3,2);
int r1 = calc(c: 2,b:3,a:4);
int r3 = calc (4,c:2,b:3);
可选参数 : 在调用方法的时候可以包含这个参数也可以省略他
为了表明某个参数是可选的,需要在方法的声明的时候为参数提供默认值。只有值参数类型可以作为可选参数类型。所有必填参数必须在可选参数声明之前声明。如果有paras参数,必须在所有可选参数之后声明。
public int calc ( int x, decimal y ,...int a=3, double b = 15, ... params int[] intvals )// 顺序 : 必填参数,可选参数,params参数
必须从可选参数列表的最后开始省略,直到列表开头,也就是只可以省略最后n个参数,不可以随便选择省略任意的参数。
栈帧 : 调用方法时,内存从栈顶开始分配,保存和方法关联的一些数据项,这块内存叫做栈帧(stack frame)
包含内容:返回地址,也就是在方法退出的时候继续执行的位置。
这些参数分配的内存,也就是方法的值参数,或者还可能是参数数组9如果有)
各种和方法调用相关的其他管理数据项。
方法调用时整个栈帧会压入栈。方法退出时,整个栈帧都会从栈上弹出。弹出栈帧也叫栈展开(unwind)
分部类 partial
每个分部类的声明都含有一些类成员的声明; 类的分部类声明可以在同一文件中也可以在不同文件中;组成类的所有分部类 都必须在一起编译;
分部方法 : 声明在分部类中不同部分的方法。
1) 返回类型必须是void; 2)不能包含访问修饰符,即必须是私有的。3)参数列表不能有out参数;4)必须有关键字partial 放在void之前。
partial class Class2
{
//因为partial 是私有的,不能从类外调用,所以方法 public add 是调用printsum 的方法
partial void PrintSum(int x, int y); //定义分布方法
public void add(int x, int y)
{
PrintSum(x, y);
}
}
partial class Class2
{
partial void PrintSum(int x, int y)
{
Console.WriteLine(" the sum is {0}", x + y); // 实现分部方法
Console.ReadKey();
}
}
class Program
{
static void Main(string[] args)
{
var mc = new Class2();
mc.add(5, 6);
}
}
最后输出 the sum is 11;
数组
class Class3
{
public int var = 0;
}
// int[] arr = new int[] { 1, 2, 3 };
// foreach (int item in arr)
// item++; // 错误,不能改变迭代变量值
Class3 [] classarray = new Class3[4];
for (int i = 0; i < 4; i++)
{
classarray[i] = new Class3(); //别忘了这里还要new 一次
classarray[i].var = i;
}
foreach (Class3 item in classarray)
item.var += 10; //正确不能改变迭代变量的引用,但可以通过迭代变量改变数据
foreach (Class3 item in classarray)
Console.WriteLine("{0}", item.var);
Console.ReadKey();
交错数组与巨型数组;
在CIL中一维数组有特定的指令用于性能优化。矩形数组没有这些指令,并且不能再相同级别进行优化。因此,有时使用一维数组(可以被优化)的交错数组比矩形数组(不能被优化)更有效率。另一方面,矩形数组的编程复杂度要小得多,因为他会被作为一个单元而不是数组的数组。
foreach 交错数组示例
int total = 0;
int [][] arr4 = new int [2][];
arr4[0] = new int[] { 1, 2 };
arr4[1] = new int []{3,4};
foreach (int[] i in arr4)
{
Console.WriteLine("Starting the new array");
foreach (int j in i)
{
total += j;
Console.WriteLine("item is {0}, total is {1}", j, total);
}
}
Console.ReadKey();