C#语言基础
数组
交错数组
可以看成不规则的表格 每一个元素都是新的一维数组,二维数组是特殊的交错数组,就好像正方形是特殊的长方形
int[][] array = new int[4][];
array[0] = new int[3];
array[1] = new int[5];
array[2] = new int[4];
array[3] = new int[1];
array[0][0] = 1;
参数数组
整数相加的方法 当类型确定 个数不确定的情形下,用数组来做
private static int Add(int[] arr)
{
int sum = 0;
foreach(var item in arr)
{
sum += item;
}
return sum;
}
这里的参数用int[] ,在输入时需要输入整个数组,比较麻烦 我们就可以用params参数数组
static void Main(string[] args)
{
int result01 = Add( 1, 34, 43, 54, 78 );
}
private static int Add(params int[] arr)
{
int sum = 0;
foreach(var item in arr)
{
sum += item;
}
return sum;
}
参数数组,对于方法内部而言:就是一个普通数组;对于方法外部(调用者)而言:可以传递数组、一组数据类型相同的变量集合、也可以不传递参数
作用:简化调用者调用方法的代码
数据类型
数据类型
类型分类
通用类型系统CTS是.NET框架中的一个组成部分,为所有面向.NET框架的语言定义了数据类型的规则
值类型:存储数据本身 引用类型:存储数据的引用(内存地址)
类型归属
内存
- 是CPU与其他外部存储器交换数据的桥梁
- 用于存储正在执行的程序与数据,即数据必须加载到内存才能被CPU处理
- 通常开发人员表达的“内存”都是指内存条
分配
程序运行时,CLR(公共语言运行池)将申请的内存空间从逻辑上进行划分 栈区: - 空间小(1MB),读取速度很快 - 用于存储正在执行的方法,分配的空间叫做栈帧。栈帧中存储方法的参数以及变量等数据。方法执行完毕后,对应的栈帧将被清除 堆区: - 空间大,读取速度慢 - 用于存储引用类型的数据
局部变量
定义在方法内部的变量(参数也属于) 特点:
- 没有默认值,必须自行设定初始值,否则不能使用
- 方法被调用时,存在栈中,方法调用结束时从栈中清除
值类型与引用类型
- 值类型:声明在栈中,数据存储在栈中
- 引用类型:声明在栈中,数据存储在堆中,栈中存储该数据的引用
方法执行在栈中,所以在方法中声明的变量都在栈中 可以把变量名认为是内存地址的别名,仅有名字含义 变量在内存中都是一块空间,并且有其地址,变量名只是方便程序员操作这块空间 因为值类型直接存储数据,所以a的数据存储在栈中 因为引用类型存储数据在堆里,所以在栈中存储的是堆中数据的地址
int a = 1;
int b = a;
a = 2;
Console.WriteLine(b);
int[] arr = new int[] { 1 };
int[] arr2 = arr;
arr[0] = 2;
Console.WriteLine(arr2[0]);
这里的b的值是1,而arr2[0]的值是2。因为b复制的是a的数据,而arr2复制的是arr里的地址,代码改变了数据的值后,b并没有变,而arr2对应的数据变化了 如果是object,跟string等引用类型一致
问题:
static void Main()
{
int c = 1;
int[] arr = new int[]{1};
Fun1(c,arr);
Console.WriteLine(c);
Console.WriteLine(arr[0]);
}
private static void Fun1(int c,int[] arr)
{
c = 2;
arr[0] = 2;
}
输出结果是多少?为什么? 调用方法类似于赋值, Fun1(b,arr);//实参将数据1、数组引用赋值给形参
如果fun1中是arr = new int[]{2},则是开辟了新的空间,指向了新的在堆中的地址
int num01 = 1, num02 = 1;
bool r1 = num01 == num02;
int[] arr01 = new int[] { 1 }, arr02 = new int[] { 1 };
bool r2 = arr01 == arr02;
bool r3 = arr01[0] == arr02[0];
值类型与引用类型的应用
值参数:按值传递–传递实参变量存储的内容 作用:传递信息
引用参数:按引用传递–传递实参变量自身的内存地址 private static void Fun2(ref int a) 方法内部修改引用参数,实质上就是在修改实参变量 作用:改变数据
输出参数:按引用传递–传递实参变量本身的内存地址 private static void Fun3(out int a) 作用:返回结果,可以返回多个结果,原本的方法中只有return才能返回一个结果
区别:
- 输出参数方法内部必须为输出参数赋值,引用参数则不用
- 在传递参数的时候,输出参数可以不赋值,引用参数需要赋值(正常传递参数都要赋值)
练习
练习一:定义 两个整数交换的方法
练习二:根据矩形的长、宽求面积和周长
|