易顺金
大脑经常短路,陷入死循环。

程序

进程

线程  线程栈

程序运行时数据存储的内存区域

栈   内存数组 

      某些类型变量的值  程序当前的执行环境 传递给方法的参数

      数据项压入栈顶 数据只能从栈的顶部插入和删除  入栈 出栈

     值类型

      预定义类型  非数值类型 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();
            //类中函数成员访问 数据成员
        }
    }
}

 

 

posted on 2012-06-29 11:14  易顺金  阅读(143)  评论(0编辑  收藏  举报