C#进阶学习第九天

1.值类型和引用类型

1.值类型 变量中保存的就是数据本身 int a = 4; 由操作系统管理
引用类型 变量保存的是数据地址 string b = “luohai”; 由垃圾回收器管理
值类型可能在堆和栈上,看其是否嵌套其它类型 引用类型一定在堆上!

2.引用类型嵌套值类型
class A{ private int a; }
int main(){ A b = new A();}
此时,b在栈上存储对象的地址,对象在堆上,对象中的变量a也在堆上面。

3.引用类型嵌套引用类型
class B{ private string c;}
int main(){ A b = new A();}
对象中的变量c在堆上,保存的是数据地址(也在堆上)

4.值类型嵌套引用类型
struct C{private string c;}
int main(){ C b = new A();}
b在栈上,对象中的变量c在堆上面

5.值类型嵌套值类型
struct D{private int c;}
int main(){ D b = new A();}
b在栈上, 对象中的变量c在栈上面

 注:1.值类型继承  valuetype, 而valuetype又继承system.object
       引用类型继承system.object
     2.值类型默认值0,引用类型null

2.类型的转换,装箱拆箱

装箱:值类型转换引用类型 int a = 3; object o=a; //等同于object o= 3;
在堆上开辟一块空间,将栈上的数据拷贝到堆上,在将堆空间的地址赋值给引用类型o

拆箱:引用类型转换值类型 int i = (int)o;
1.首先检查o是否为null,空则抛出异常,无误则继续检查变量和拆箱后的类型是否一致
2.返回堆空间的地址
3.将改变类型变量i
object t=“5”; int d= int.parse( (string)t ); //不是拆箱

注:被装箱过后的数据可以拆箱,并不是所有类型都可以拆箱
         装箱和拆箱都存在数据赋值,比较耗费资源,最好使用范型进行编程

3.参数传递问题

1.值类型参数按照值传递 修改形参不会影响实参
2.引用类型参数按照值传递, 传递的是地址,通过地址修改地址上的内容
3.值类型和引用类型参数的按引用传递
通过ref或out关键字,可以将值类型变脸按引用类型进行传递,
实际传递给形参的是实参的地址,然后通过形参改变实参 //不加ref 传的的是字符串的地址

    public static void cc(ref string c)            //ref关键字 传的是c的地址,
     {c = “la”; }                                  //改变的是形参的地址,没有改变实参	
    public static void bb(ref int b)
    {b += 2;  }
    public static void dd(out int d)               //out关键字   通过形参给实参赋值
    {d = 100; }
    int main()
     { int b = 4;                string c = "hello";        int d;
        bb (ref b);              cc (ref c);                dd (out d);
        Console.WriteLine (b);  Console.WriteLine (c);    Console.WriteLine (d);
     } 
              

猜你喜欢

转载自blog.csdn.net/JingDuiTell/article/details/88735695