值类型和引用类型及参数传递

值类型和引用类型:

C#数据类型分为两大类:值类型和引用类型。

值类型数据主要有:结构体struct,枚举体enum,布尔型bool,浮点型,整型。

引用类型数据主要有:数组,字符串,接口,委托,类。

值类型和引用类型的区别:

  引用类型继承自System.Object,值类型继承自System.ValueType。

  引用类型保存到内存的堆heap中,值类型保存在内存的堆栈stack中。在.net中,栈的内存是自动释放的,而堆会有垃圾回收器GC来释放。

  引用类型可以派生出新的类型,而值类型不可以。引用类型可以包含null值,而值类型不可以。

  引用类型变量赋值只复制对象的引用,不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。

下面一个小例子可以简单说明值类型和引用类型:

class PointR
    {
        public int x, y;
    }
    struct PointV
    {
        public int a, b;
    }

    class Program
    {
        static void Main(string[] args)
        {
            //给一个引用类型赋值将复制到一个对象的引用,而给一个值类型赋值将复制一个对象的值
            PointR r;
            PointV v;
            r = new PointR();
            v = new PointV();
            r.x = 7;
            v.a = 7;

            PointR pr = r;
            PointV pv = v;

            pr.x = 9;
            pv.a = 9;
            Console.WriteLine(r.x);//9
            Console.WriteLine(v.a);//7

            Console.Read();
        }
    }

C#参数传递:

.net默认的是通过值传送变量,但是也可以迫使值参数通过引用传送给方法。C#要求对传递给方法的参数进行初始化。在传递给方法之前,无论时按值传递,还是按引用传递,变量都必须初始化。 ref关键字:可以迫使值参数通过引用传送给方法。即:在.net中,如果把一个参数传递给方法,且这个方法的输入参数前带有ref关键字,则该方法对变量所做的任何改变都会影响原来对象的值。下面一个小例子说明按值传递和ref参数传递:

class Program
    {
        //默认值,C#的参数是按值传递的,这也是最常见的情况
        static void Method1(int p)
        {
            ++p;
        }

        //为了按引用传递,C#提供了参数修饰字ref,。ref修饰字要求变量在传递给方法之前必须赋值
        static void Method2(ref int p)
        {
            ++p;
        }

        static void Main(string[] args)
        {
            int x = 9;
            int y = 9;
            Method1(x);
            Method2(ref y);
            Console.WriteLine(x);//9
            Console.WriteLine(y);//10

            Console.Read();
        }
    }

在方法的输入参数前面加上out关键字时,传递给该方法的变量可以不初始化。该变量通过引用传递,所以在从被调用的方法中返回时,方法对该变量进行的任何改变都会保留下来。在调用该方法时,还需要使用out关键字,这与在定义该方法时一样。并且out修饰字要求变量在从方法返回时必须赋值。举例说明:

class Program
    {
        //out修饰字要求变量在从方法返回时必须赋值
        static void Split(string name, out string firstName, out string lastName)
        {
            int i = name.LastIndexOf(‘ ‘);
            firstName = name.Substring(0, i);
            lastName = name.Substring(i + 1);
        }

        static void Main(string[] args)
        {
            string a, b;
            Split("zhou enlai", out a, out b);
            Console.WriteLine("{0}+ {1}", a, b);//zhou+ erlai

            Console.Read();
        }
    }

还有一个params修饰传递参数,不多说,直接举例:

class Program
    {
        //params 修饰字可以使用在方法的最后一个参数上,这样方法就可以接受任意数目的某种类型的参数
        static int Add(params int[] arr)
        {
            int sum = 0;
            foreach (int i in arr)
            {
                sum += i;
            }
            return sum;
        }

        static void Main(string[] args)
        {
            int i = Add(1, 1, 2, 3, 4, 5, 6);
            Console.WriteLine(i);//22

            Console.Read();
        }
    }

时间: 2024-10-15 14:05:22

值类型和引用类型及参数传递的相关文章

C#学习笔记(三):值类型、引用类型及参数传递

值类型和引用类型简介 C#中存在两种数据类型,分别是值类型与引用类型,下面我们来看看这两种类型的区别. 值类型主要包括: 简单类型(如int.float.char等,注意string不是值类型): 枚举类型(enum): 结构体类型(struct): 引用类型主要包括: 类类型(如string): 数组类型(一维或多维数组): 接口类型(interface): 委托类型(delegate): 内存分布 值类型的实例大部分情况下会被存放在线程的堆栈上,由操作系统管理其在内存上的分配和释放. 引用类

枚举|标志枚举+|(或)和&(与)运算|类型转换|值类型和引用类型|传参|异常|垃圾回收

枚举部分 enum 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常量组成的独特类型. 通常情况下,最好是在命名空间内直接定义枚举,以便该命名空间中的所有类都能够同样方便地访问它. 但是,还可以将枚举嵌套在类或结构中.默认情况下,第一个枚举数的值为 0,后面每个枚举数的值依次递增 1. 例1: //此枚举的默认值是从0开始 enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; 例2: //此枚举的默认值是从1开始,下标为3的tue值为7,从下标3开始

.NET的堆和栈02,值类型和引用类型参数传递以及内存分配

在" .NET的堆和栈01,基本概念.值类型内存分配"中,了解了"堆"和"栈"的基本概念,以及值类型的内存分配.我们知道:当执行一个方法的时候,值类型实例会在"栈"上分配内存,而引用类型实例会在"堆"上分配内存,当方法执行完毕,"栈"上的实例由操作系统自动释放,"堆"上的实例由.NET Framework的GC进行回收.而本篇的重点要放在:值类型和引用类型参数的传递,

探索C#中的值类型和引用类型

记得大三上学期上C#课程的时候,老师第一堂课就重点给我们讲了一下C#中的数据类型.我们都知道,C#是一门强类型的高级编程语言,了解它的数据类型是非常有必要的.老师当时给我们列举了很多数据类型,然后问我们哪些是值类型,那些是引用类型.说实话,当时对于这个问题还真是回答不上来,或许可以说是自己没有多少底气回答.虽然大一学C++的时候接触过值类型和引用类型,但是因为没有深究,或者根本没有真正了解他们的区别,以至于在自己写代码时无形当中用到了却还是不了解它们之间的具体区别. 现在大四了,也到了快紧张面试

[转] 值类型与引用类型(下)

本文将介绍以下内容: 类型的基本概念 值类型深入 引用类型深入 值类型与引用类型的比较及应用 [下载]:[类型示例代码] 1. 引言 值类型与引用类型的话题经过了两个回合([第八回:品味类型---值类型与引用类型(上)-内存有理]和[第九回:品味类型---值类型与引用类型(中)-规则无边])的讨论和切磋,我们就基本的理解层面来说已经差不多了,但是对这一部分的进一步把握和更深刻的理解还要继续和深化,因为我自己就在两篇发布之际,我就得到装配脑袋兄的不倦指导,之后又查阅了很多的资料发现类型在.NET或

[转] 值类型与引用类型(中)

本文将介绍以下内容: 类型的基本概念 值类型深入 引用类型深入 值类型与引用类型的比较及应用 1. 引言 上回[第八回:品味类型---值类型与引用类型(上)-内存有理]的发布,受到大家的不少关注,我们从内存的角度了解了值类型和引用类型的所以然,留下的任务当然是如何应用类型的不同特点在系统设计.性能优化等方面发挥其作用.因此,本回是对上回有力的补充,同时应朋友的希望,我们尽力从内存调试的角度来着眼一些设计的分析,这样就有助于对这一主题进行透彻和全面的理解,当然这也是下一回的重点. 从内存角度来讨论

.NET之值类型与引用类型

C#是类型安全的开发语言,它的数据类型分为值类型(Value Type)和引用类型(Reference Type)两种. 一.值类型(Value Type) 字     符:char U+0000 - U+ffff 16位 Unicode字符(其实字符也是一种整型) 整     型:sbyte.byte.short.ushort.int.uint.long.ulong 浮 点 型:float(7位有效为).double(15到16位有效位) decimal:128位数据类型,相比浮点型而言具有更

[转] 值类型与引用类型(上)

本文将介绍以下内容: 类型的基本概念 值类型深入 引用类型深入 值类型与引用类型的比较及应用 1. 引言 买了新本本,忙了好几天系统,终于开始了对值类型和引用类型做个全面的讲述了,本系列开篇之时就是因为想写这个主题,才有了写个系列的想法.所以对值类型和引用类型的分析,是我最想成文的一篇,其原因是过去的学习过程中我就是从这个主题开始,喜欢以 IL 语言来分析执行,也喜好从底层的过程来深入了解.这对我来说,似乎是一件找到了有效提高的方法,所以想写的冲动就没有停过,旨在以有效的方式来分享所得.同时,我

.Net Framemwork 之 值类型和引用类型的存储

C#把数据类型分为两种:值类型 和 引用类型.值类型存储在堆栈中,而引用类型存储在托管堆上. 一.值类型和引用类型变量的存储 首先,变量是存储信息的基本单元,而对于计算机内部来说,变量就相当于一块内存空间. C#中的变量数据类型有两种: [1] 值类型:简单类型.结构类型.枚举类型 [2] 引用类型:类.代表.数组.接口. 1.值类型和引用类型内存分配  值类型是在栈中操作,而引用类型则在堆中分配存储单元. 栈在编译的时候就分配好内存空间,在代码中有栈的明确定义,而堆是程序运行中动态分配的内存空