zoukankan      html  css  js  c++  java
  • 值类型和引用类型及参数传递

    值类型和引用类型:

    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();
            }
        }
    复制代码
  • 相关阅读:
    python基础008----Python中类/函数/模块的简单介绍
    linux基础004---用户管理、用户登录注销、系统关机重启
    python基础006----流程控制&推导式&深浅拷贝
    python基础005----字典&集合
    python基础004----列表&元组
    难缠的布隆过滤器,这次终于通透了
    C# 位图BitArray 小试牛刀
    以步步为营的风格解读 Redis分布式锁
    你是不是对MD5算法有误解?
    最适合新手的Redis Cluster搭建过程
  • 原文地址:https://www.cnblogs.com/weihengblogs/p/4964749.html
Copyright © 2011-2022 走看看