zoukankan      html  css  js  c++  java
  • C#基础|值类型和引用类型以及传参问题

    为了明白什么是值类型和引用类型,先引入你两个概念。堆内存与栈内存
     
    堆内存与栈内存
     
    由于咱的描述能力有限,就不对其下定义了,来看看两者的作用。
     
    共同点:
    都是用来存放数据的
     
    不同点:
    堆内存:堆允许程序在运行时动态的申请某个大小的内存空间,用于存放对象的实例。换句话说,堆用于存放由new创建的对象和数组。
    栈内存:主要用来存储局部变量的值。局部变量包括各种基本类型的变量,像int,char等,还包括对象的引用变量。
     
    值类型和引用类型
     
    有如下代码:
    int n = 1;
    Person p = new Person();
    根据上面对堆内存和栈内存的描述可以得出,
    变量n的值是存放在栈中的,它里面的内容就是1
    变量p的值也是存放在栈中的,它里面的内容却是一个地址。这个地址正是Person的实例在堆中的地址。
    如下图
    把像n一样的变量类型称为值类型。
    把像p一样的变量类型称为引用类型。
     
    按值传递与按引用传递
     
    函数传递变量有两种方式,按值传递和按引用传递,默认是按值传递,若要按引用传递要加上关键字ref.
    像这样fun(ref int i);。
    按值传递,传递的是该变量在栈中的值。
    按引用传递,传递的是该变量在栈中的地址。
     
    上面解释那么多都是为了看懂代码,下面是代码。
    现有如下代码:
    //主函数中的代码:
    Person p1 = new Person();
    Person p2 = new Person();
    p1.Name = "icez1";
    p2.Name = "icez2";
    fun(p1, p2);
    Console.WriteLine("{0},{1}", p1.name, p2.name);
     
     
    //函数代码
    void fun(Person _p1, ref Person _p2)
    {
    Person _p3 = new Person();
    _p3.Nmae = "icez3";
    _p1 = _p3;
    _p2 = _p3;
    }
     
     
    运行结果:
    icez1,icez3;
     
    结束语
     
    写这篇随笔的目的是出于锻炼自己的表达能力和思维逻辑能力的,若给你后面的学习带来误解请谅解。
     
    2014/1/18 18:00
  • 相关阅读:
    递归
    书评:《C程序设计语言》
    下一代互联网,今日揭开面纱:IPv6真的要来了
    庆祝Alan Mathison Turing(艾伦·图灵)诞辰100周年!
    svn常用命令行和批处理
    ORACLE 9i数据导入到ORACLE 10G中文出现的乱码问题
    Oracle 11G 的客户端,不再支持连接到ORACLE 8I
    DB2 一个汉字的Byte数,太操蛋了
    关于Windows 7 64位下Visual Studio 2010 开发的Asp.net程序连接Oracle 的出现的问题
    Web Frame 跨域调用Session 丢失问题
  • 原文地址:https://www.cnblogs.com/icez/p/3528651.html
Copyright © 2011-2022 走看看