zoukankan      html  css  js  c++  java
  • ref和out的区别,值类型和引用类型的使用

    今天刚刚明白ref和out的区别,只限于个人理解如有不同请赐教,谢谢

    首先我感觉ref和out是针对于值类型来说,以前一直认为是针对于引用类型看下面的一段代码

    1.首先结果 i=0;ints[0]=0    i=0;ints[0]=100

    2.ints作为一个引用类型在传入方法后,对ints[0]进行了赋值,是将引用类型的地址引用到了100这个值得堆上,

    3.而值类型i引入到另外一个方法后进行赋值不会对原有字符串进行改变

    4.ref就是为了解决这个问题,让值类型能够和引用类型一样在传入方法后值会进行改变

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Demo
    {
        class Program
        {
            static void SomeFunction(int[] ints, int i)
            {
                ints[0] = 100;
                i = 100;
            }
            static void Main(string[] args)
            {
                int i = 0;
                int[] ints = { 0, 1, 2, 3, 4 };
                Console.WriteLine("i=" + i);
                Console.WriteLine("ints=" + ints[0]);
                SomeFunction(ints, i);
                Console.WriteLine("i=" + i);
                Console.WriteLine("ints=" + ints[0]);
                Console.ReadKey();
            }
        }
    }
    View Code

    5.将代码添加上ref  结果:i=0;int[0]=0;i=100;ints[0]=100

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Demo
    {
        class Program
        {
            static void SomeFunction(int[] ints, ref int i)
            {
                ints[0] = 100;
                i = 100;
            }
            static void Main(string[] args)
            {
                int i = 0;
                int[] ints = { 0, 1, 2, 3, 4 };
                Console.WriteLine("i=" + i);
                Console.WriteLine("ints=" + ints[0]);
                SomeFunction(ints, ref i);
                Console.WriteLine("i=" + i);
                Console.WriteLine("ints=" + ints[0]);
                Console.ReadKey();
            }
        }
    }
    View Code

    所以我认为ref是对值类型的改变而且和out一样,在进行传递参数的时候对变量进行了初始化。

    而out只是在传递参数的时候不用进行赋值,但是在调用的方法里面必须进行赋值,负责会报没被赋值的out参数

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Demo
    {
        class Program
        {
            static void SomeFunction(int[] ints, out int i)
            {
                ints[0] = 100;
                i = 100;
            }
            static void Main(string[] args)
            {
                int i;
                int[] ints = { 0, 1, 2, 3, 4 };
               //Console.WriteLine("i=" + i);
                Console.WriteLine("ints=" + ints[0]);
                SomeFunction(ints, out i);
                Console.WriteLine("i=" + i);
                Console.WriteLine("ints=" + ints[0]);
                Console.ReadKey();
            }
        }
    }
    View Code
  • 相关阅读:
    创建者模式 -- 单例模式(反射&序列化)
    设计模式(总)
    并不是static final 修饰的变量都是编译期常量
    内部类和静态内部类的加载顺序
    所有的Java虚拟机必须实现在每个类或接口被Java程序 “ 首次主动使用 ” 时才初始化他们
    24 shell 管道命令与过滤器
    26 bash shell中的信号
    25 Linux中的信号
    23 shell 进程替换
    22 shell组命令与子进程
  • 原文地址:https://www.cnblogs.com/1003487863qq/p/3647425.html
Copyright © 2011-2022 走看看