程序
进程
线程 线程栈
程序运行时数据存储的内存区域
栈 内存数组
某些类型变量的值 程序当前的执行环境 传递给方法的参数
数据项压入栈顶 数据只能从栈的顶部插入和删除 入栈 出栈
值类型
预定义类型 非数值类型 bool char 数值类型 整数类型 浮点类型
用户定义类型 struck enum
堆 heap 内存区域
以任意顺序存入和移除,
对于引用类型的任何对象,它所有的数据成员(数据成员,函数成员)都存放在堆里,无论它们是值类型还是引用类型。
引用类型存储的实际数据位于堆中
预定义类型 object ,string ,dynamic 用户定义类型 class,interface,delegate,arrary
栈帧 stack frame调用方法的时候,从栈的顶部开始分配,保存和方法关联的一些数据项,这块内存叫方法的栈帧
返回地址 值参数 或参数数组 各种和方法调用相关的其他管理数据项
方法调用时,整个栈帧都会压入栈
方法退出时,整个栈帧从栈上弹出 栈展开
变量
本地变量 栈或者栈和堆 不能自动初始化 值类型栈 引用类型 堆
类字段 堆 自动初始化
结构字段 栈或堆 自动初始化
参数 栈 不能自动初始化 方法调用前 实参变量在栈中
值参数 实参必须被赋值或是表达式 调用时 为形参在栈中分配空间 复制实参给形参,方法结束后,形参
弹出,引用类型实参的值被方法内部行为改变 。
ref引用参数 实参必须是变量被赋值 方法声明和调用都用ref 调用时 形参名设置为实参的别名 指向相同内
存位置 , 方法结束后,形参名称失效, 实参的值全部被方法内部行为改变。
out输出参数 实参必须是变量 方法声明和调用都用out 调用时 形参名设置为实参的别名 但实参不在方法
的作用域内,不能访问实参。 方法内部对形参赋值,方法结束后,形参名称失效,实参的值全
部被方法内部行为改变。
params参数数组 方法声明params。
延伸式分离的参 编译器接受实参列表在堆中创建并初始化一个数组, 把数组的引用保存到栈
中的形参里,如果在对应的形参数组的位置没有实参,编译器会创建一个有零个元素的数组来
使用 。当数组在堆中创建时,实参的值被复制到数组中,如果数组参数是值类型,那么值被
复制,实参不受方法内部的影响,如果参数是引用类型,那么引用被复制,实参的引用的对象
可以受到方法内部的影响。
数组做实参 编译器使用数组而不是重新创建一个。
参数数组 堆 自动初始化
类的实例 类类型的变量 引用在栈 new运算符为实际数据分配内存
每个实例都拥有自己的各个类成员的复制,改变一个实例字段的值不会影响其他实例中成员的值。
静态字段被类的所有实例共享 访问同一内存地址,改变对所有实例成员都可见。
数组是引用类型,但数组元素可以是值类型,应用类型,分为值类型数组,引用类型数组。数组声明维度固定,实例化长度确定,在foreach循环中,迭代变量是个数组元素的只读别名,不可改变其值。但引用类型数组元素,迭代变量存储的是数组元素的引用,通过改变数组元素的引用来改变引用数组。
clone方法浅复制 值类型数组产生两个独立的数组 引用类型产生指向相同对象的两个数组
namespace ConsoleApplication1 { class Program// { // int i = 0;//字段 类成员默认private i = 3;错误 1 非静态的字段、方法或属性“ConsoleApplication1.Program.i”要求对象引用 I:\endsubmit\ConsoleApplication1\Program.cs 17 29 main方法 static int i = 0;//静态字段加载在堆上分配内存,在任何地方对它进行赋值,改变可见。 // void print() static void print()//方法声明 在main()中调用加static { // i = 3;//访问字段赋值 非静态的字段方法属性需要。。对象的引用 // Program . i = 3;//完全限定名称,方法中局部变量和全局变量同名时 ? i = 3; Console.WriteLine(i); } static int sum(int a,int b)//值参数 { int initial = 0;//本地变量 for (int i = a; i <= b; i++) { initial += i;//方法内部赋值 } return initial;//返回赋值后变量 } static void Main(string[] args)//静态方法调用静态方法 { int result = sum(1, 29); Console.WriteLine("{0}",result ); //18中方法重载 object value Console.WriteLine( result);//18中方法重载 int value print();//方法调用 Console.WriteLine(i); Console.ReadKey(); //类中函数成员访问 数据成员 } } }