欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C#中的参数传递

程序员文章站 2022-07-16 19:24:31
...

按值传递

c#中的参数传递,根据参数的类型可以分为四类

  • 值类型参数的按值传递
  • 引用类型参数的按值传递
  • 值类型参数的按引用传递
  • 引用类型参数的按引用传递

在默认情况下,CLR方法中参数的传递都是按值传递

值类型参数的按值传递

对于参数又分为:
形参:被调用方法中的参数,实参:调用方法的参数

class Program
    {
        static void Main(string[] args)
        { 
            int addNum = 1;
            // addNum 就是实参,
            Add(addNum); 
         }
        // addnum就是形参,也就是被调用方法中的参数
        private static void Add(int addnum)
        {
            addnum = addnum + 1;
            Console.WriteLine(addnum);
        }
} 

对于值类型的按值传递,传递的是该值类型实例的一个拷贝,也就是形参此时接受到的是实参的一个副本,被调用方法操作是实参的一个拷贝,所以此时并不影响原来调用方法中的参数值,为了证明这点,看看下面的代码和运行结果就明白了:

class Program
    {
         static void Main(string[] args)
        { 
            // 1. 值类型按值传递情况
            Console.WriteLine("按值传递的情况");
            int addNum = 1;
            Add(addNum);
            Console.WriteLine(addNum);   
            Console.Read();
        }

        // 1. 值类型按值传递情况
        private static void Add(int addnum)
        {
            addnum = addnum + 1;
            Console.WriteLine(addnum);
        }
} 

运行结果为:
C#中的参数传递
C#中的参数传递

引用类型参数的按值传递

当传递的参数是引用类型的时候,传递和操作的是指向对象的引用,此时方法的操作就会改变原来的对象。

class Program
    {
        static void Main(string[] args)
        { 
            // 2. 引用类型按值传递情况
            RefClass refClass = new RefClass();
            AddRef(refClass);
            Console.WriteLine(refClass.addnum);
        }    
         // 2. 引用类型按值传递情况
        private static void AddRef(RefClass addnumRef)
        {
            addnumRef.addnum += 1;
            Console.WriteLine(addnumRef.addnum);
        }
}
class RefClass
    {
        public int addnum=1;
    }

运行结果为:
C#中的参数传递
C#中的参数传递

String引用类型的按值传递的特殊情况

对于String类型同样是引用类型,然而对于string类型的按值传递时,此时引用类型的按值传递却不会修改实参的值

class Program
    {
        static void Main(string[] args)
        { 
              // 3. String引用类型的按值传递的特殊情况
            string str = "old string";
            ChangeStr(str);
            Console.WriteLine(str);
        }
         // 3. String引用类型的按值传递的特殊情况
        private static void ChangeStr(string oldStr)
        {
            oldStr = "New string";
            Console.WriteLine(oldStr);
        }
}

运行结果为:
C#中的参数传递
C#中的参数传递

按引用传递

不管是值类型还是引用类型,我们都可以使用ref 或out关键字来实现参数的按引用传递,然而按引用进行传递的时候,需要注意下面两点:

方法的定义和方法调用都必须同时显式使用ref或out,否则会出现编译错误

CLR允许通过out 或ref参数来实现方法重载。如:

#region CLR 允许out或ref参数来实现方法重载
        private static void Add(string str)
        {
            Console.WriteLine(str);
        }

        // 编译器会认为下面的方法是另一个方法,从而实现方法重载
        private static void Add(ref string str)
        {
            Console.WriteLine(str);
        }
#endregion

按引用传递可以解决由于值传递时改变引用副本而不影响引用本身的问题,此时传递的是引用的引用(也就是地址的地址),而不是引用的拷贝(副本):

class Program
    {
        static void Main(string[] args)
        { 
            #region 按引用传递
            Console.WriteLine("按引用传递的情况");
            int num = 1;
            string refStr = "Old string";
            ChangeByValue(ref num);
            Console.WriteLine(num);
            changeByRef(ref refStr);
            Console.WriteLine(refStr);
            #endregion 

            Console.Read();
        }

        #region 按引用传递
        // 1. 值类型的按引用传递情况
        private static void ChangeByValue(ref int numValue)
        {
            numValue = 10;
            Console.WriteLine(numValue);
        }

        // 2. 引用类型的按引用传递情况
        private static void changeByRef(ref string numRef)
        {
            numRef = "new string";
            Console.WriteLine(numRef);
        }

        #endregion
}

运行结果为:
C#中的参数传递
C#中的参数传递