zoukankan      html  css  js  c++  java
  • C#中 ref 关键字的认识和理解

    C#中 ref 关键字的认识和理解

    之前接手老项目的时候有遇到一些的方法参数中使用了ref关键字加在传参的参数前面的情况。对于新手,这里介绍和讲解一下ref的用法和实际效果。

    • CLR中默认所有方法的参数传递方式都是传值,也就是说不管你传递的对象是值类型还是引用类型,在作为参数传入到方法中时,传递的是原对象的副本。无论在方法中对该对象做何更改,都不影响外部的对象。
    • 而使用了ref参数之后,传递的是对象的引用
      1. 对于值类型,传递的是值的引用,可以理解为值的地址
      2. 对于引用类型,传递的就是变量的引用,同样可以理解成变量的栈地址

    值类型对象使用ref参数示例

     C# 控制台程序 值类型对象使用ref参数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    class Program
    {
        static void Main(string[] args)
        {
            int testInt = 10;
            Console.WriteLine(testInt);

            DoRef(ref testInt);
            Console.WriteLine(testInt);

            DoNotRef(testInt);
            Console.WriteLine(testInt);

            Console.ReadLine();

        }

        public static void DoRef(ref int txt)
        {
            txt = 10000000;
        }
        public static void DoNotRef(int txt)
        {
            txt = 55555555;
        }
    }
    结果 ![](https://img2018.cnblogs.com/blog/1060719/202001/1060719-20200117172410223-15416875.png)

    string类型对象使用ref参数示例

     C# 控制台程序 String类型对象使用ref关键字传参
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    class Program
    {
        static void Main(string[] args)
        {
            string testValue = "origin";
            Console.WriteLine(testValue);

            UseRef(ref testValue);
            Console.WriteLine(testValue);

            NotUseRef(testValue);
            Console.WriteLine(testValue);

            Console.ReadLine();
        }
        public static void UseRef(ref string txt)
        {
            txt = "ref txt";
        }
        public static void NotUseRef(string txt)
        {
            txt = "not ref txt";
        }
    }
    结果 ![](https://img2018.cnblogs.com/blog/1060719/202001/1060719-20200117172410223-15416875.png)

    类对象使用ref传参示例

     C# Code 控制台程序 类对象使用ref关键字传参
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    class Program
    {
        static void Main(string[] args)
        {
            TestModel t0 = new TestModel()
            {
                Text = "test"
            };

            Console.WriteLine(t0.Text);

            UseRef(ref t0);
            Console.WriteLine(t0.Text);

            NotUseRef(t0);
            Console.WriteLine(t0.Text);

            Console.ReadLine();
        }
        public static void UseRef(ref TestModel tModel)
        {
            tModel.Text = "use ref";
        }
        public static void NotUseRef(TestModel tModel)
        {
            tModel.Text = "not use ref";
        }
    }

    public class TestModel
    {
        public string Text { get; set; }
    }

    结果

    作者: 啊萧Styvn

    出处:https://www.cnblogs.com/Joick/p/12206715.html

    版权:本站使用「CC BY 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。

  • 相关阅读:
    Codeforces 651 A. Joysticks
    Codeforces 538 C. Tourist's Notes
    Codeforces 538 B. Quasi Binary
    Codeforces 538 A. Cutting Banner-substr()函数字符串拼接
    Codeforces 626 C. Block Towers-二分 (8VC Venture Cup 2016-Elimination Round)
    Codeforces 626 B. Cards (8VC Venture Cup 2016-Elimination Round)
    hdu 4825 Xor Sum trie树
    Codeforces Round #358 (Div. 2) C. Alyona and the Tree dfs
    Codeforces Round #357 (Div. 2) 优先队列+模拟
    2016 湘潭邀请赛
  • 原文地址:https://www.cnblogs.com/zbliao/p/12867719.html
Copyright © 2011-2022 走看看