一、值类型、引用类型和指针类型
C#有三种类型:引用类型、值类型和指针类型。
1、值类型:在栈中分配空间,由系统自动分配
如:枚举类型、j结构类型(数值类型(decimal、整数类型(sbyte、byte、char、short、short、int、uint、long、long)、浮点类型(float、double))、布尔类型、自定义结构类型)
PS:double相比,decimal 类型具有更高的精度和更小的范围
2、引用类型:在堆中分配空间,由程序员用“new”来分配空间
如:Object、string、类(class)、接口(interface)、委托(delegate)、数组
3、指针类型同C和C++一样的使用,但还有一些特殊的地方,此处不讨论。
值类型在做赋值操作的时候,值类型变量相互赋值之后,两变量做任何操作都互不受影响,因为他们储存在不同的空间。
引用类型相互赋值之后,因为他们共用一个空间,互相影响,一个值改变,另一个值也相应改变。
二、引用参数
为了让值类型的参数达到引用类型参数的效果,ref。
ref修饰的变量在传递参数前一定要有初始值。
三、输出参数
如果想要返回一个或多个的,out。
out修饰的变量在传递之前,可以没有初始值。
四、数组参数
如果形参列表中包含数组型参数,那么它必须位于参数列表中位于最后一位,而且必须是一维数组类型。另外,数组型参数不可能将params修饰符与ref和out修饰符组合起来使用。
public int Avg (params int[] array) { int sum = 0; foreach (int a in array) { sum += a; } return sum; } hero.Avg (1, 2, 3, 4, 5, 6, 7); hero.Avg (new int[]{ 1, 2, 3, 4, 5, 6, 7 });
五、命名参数
class MyClass { public int C(int a, int b, int c)//参数声明没有区别 { return (a + b) * c; } static void Main(string[] args) { MyClass mc = new MyClass(); int result = mc.C(c: 2, a: 4, b: 3);//参数的名字和值,顺序可以不一样 Console.WriteLine("{0}", result); } }
六、可选参数
class MyClass { public int C(int a, int b = 5)//默认b为5,可选参数 { return a + b; } static void Main(string[] args) { MyClass mc = new MyClass(); int a1 = mc.C(5, 6);//使用显式值 int a2 = mc.C(5);//b使用默认值 Console.WriteLine("{0},{1}", a1,a2); } }
最后结果:11,10