zoukankan      html  css  js  c++  java
  • C#基础 (一)

    值类型和引用类型

    堆和栈

    栈存放的数据:
    (1)某些类型变量的值
    (2)程序当前的执行环境
    (3)传递给方法的参数

    堆是存放对象的地方

    对象类型有两种: 值类型和引用类型,他们的存储方式不同
    值类型: 只需要一段单独的内存,用于存储实际的数据
    引用类型: 需要两端内存
    (1)存储实际的数据,它总是位于堆中
    (2)第二段是引用,指向数据在堆中的存放位置

    捕获


           从上图也可以看到栈中既可以放引用也可以放数据.

           假若引用类型里面,持有另外一个引用类型和值类型的对象,那么它的存储方式又是怎么样的呢?如下图

    捕获1

     

    值传递

    值参数

           目前调用方法默认的值参数,调用方法的时候进行的操作如下:
      (1)在栈中为形参分配空间
      (2)将实参的值复制给形参

           看下面的例子

    class Program
        {
           
            public static void  MyMethod(MyClass myClass,int f2)
            {
                myClass.val = myClass.val + 5;
                f2 = f2 + 5;
                Console.WriteLine(string.Format("方法内: myClass.val = {0} , f2 = {1}",myClass.val,f2));
            }
    
            private static void Main()
            {
                MyClass class1 = new MyClass();
                int num = 10;
                MyMethod(class1,num);
                Console.WriteLine(string.Format("方法外: myClass.val = {0} , num = {1}", class1.val, num));
                Console.ReadKey();
            }
    
        }
    
        class MyClass
        {
            public int val = 20;
        }

    捕获3

    捕获4

             上图就可以知道值参数实际上复制了形参。

    引用参数

           不会为形参在栈中分配内存, 形参的参数名将作为实参变量的别名,指向相同的内存位置传入方法的形参,有out 类型的,或是ref 类型,前者是结束方法时必须为变量赋值,后者是变量在传入方法是个引用,这两个关键字的区别见下面两张图, ref 的引用在栈中本身就存在, 而out 存在而没有被赋值,

    输出参数

                                                                                          输出参数

    输入参数

                                                                                         输入参数

    class Program
        {
           
            public static void  MyMethod(MyClass myClass,ref int f2)
            {
                myClass.val = myClass.val + 5;
                f2 = f2 + 5;
                Console.WriteLine(string.Format("方法内: myClass.val = {0} , f2 = {1}",myClass.val,f2));
            }
    
            private static void Main()
            {
                MyClass class1 = new MyClass();
                int num = 10;
                MyMethod(class1,ref num);
                Console.WriteLine(string.Format("方法外: myClass.val = {0} , num = {1}", class1.val, num));
                Console.ReadKey();
            }
    
        }
    
        class MyClass
        {
            public int val = 20;
        }

    捕获ref

     (1)


             注意: 可以知道值参数,由于复制了一份,所以栈中会多一份数据,引用参数则不一样,栈中数据不变,只是数据的多了一个别名。

    栈帧(stack frame)
          即是方法里调用方法,每一层的调用就为一个stack frame stack frame 保存的东西有:
       (1)返回地址,即方法退出的时候继续执行的位置
       (2)方法的值参数,
       (3)各种和方法调用相关的其他管理数据项

  • 相关阅读:
    左偏树
    论在Windows下远程连接Ubuntu
    ZOJ 3711 Give Me Your Hand
    SGU 495. Kids and Prizes
    POJ 2151 Check the difficulty of problems
    CodeForces 148D. Bag of mice
    HDU 3631 Shortest Path
    HDU 1869 六度分离
    HDU 2544 最短路
    HDU 3584 Cube
  • 原文地址:https://www.cnblogs.com/Benjious/p/9460319.html
Copyright © 2011-2022 走看看