c#方法参数传值问题

weblog 4023 0 0
值类型的传值参数

方法执行时会为实参创建一个副本,方法内改变形参的值时不会改变实参的值。

引用类型的传值参数

方法会为实参创建一个副本引用,形参和实参指向的是同一个对象的内存地址,当形参引用的内存地址改变时不会改变实参引用对象的内存地址。

值类型的引用参数

这种情况下形参和实参引用的时同一个内存地址,在方法内改变形参的值就是改变实参的值。案例如下:

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 10;
            test(ref a);
            Console.WriteLine(a);
            Console.Read();
        }
        static void test(ref int a)
        {
            a = 100;
        }
    }
}

结果打印100

引用类型的引用参数

引用参数并不创建引用的副本,形参和实参是同一个引用。案例:


namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            A a = new A(1);
            test(ref a);
            Console.WriteLine(a.age);
            Console.Read();
        }
        static void test(ref A a)
        {
            a = new A(2);
            Console.WriteLine(a.age);
        }
    }
    class A
    {
       public int age;
       public A(int age)
        {
            this.age = age;
        }
    }
}

结果打印2 \n 2

值类型的输出参数

 

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 100;
            bool b=test(out a);
            Console.WriteLine(a);
            Console.Read();
        }
        static bool test(out int a)
        {
            a = 1;
            return true;
        }
    }
}

输出1

引用类型的输出参数

和值类型的引用参数相似


namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            A a;
            bool b=test(out a);
            Console.WriteLine(a.age);
            Console.Read();
        }
        static bool test(out A a)
        {
            a = new A(2);
            return true;
        }
    }
    class A
    {
       public int age;
       public A(int age)
        {
            this.age = age;
        }
    }
}
数组参数

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            int b=test(1,2,3,4);
            Console.WriteLine(b);
            Console.Read();
        }
        static int test(params int[] a)
        {
            int res=0;
            for (int i = 0; i < a.Length; i++)
            {
                res += a[i];
            }
            return res;
        }
    }
}
具名参数

 具名参数的参数顺序不受参数列表的约束。


namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            test(age:12,name:"abc");
            Console.Read();
        }
        static void test(String name,int age)
        {
            Console.WriteLine(name + ":" + age);
        }
    }
}
 可选参数

可选参数具有默认值 

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            test();
            test(age: 12);
            test(age:12,name:"abc");
            Console.Read();
        }
        static void test(String name="sdf",int age=10)
        {
            Console.WriteLine(name + ":" + age);
        }
    }
}
 扩展方法

 当无法对一个数据类型的源码进行修改的时候可以通过扩展方法对目标数据类型追加方法。

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            //想为double添加一个保留n位小数的方法
            double d = 0.123456;
            d=d.test(2);
            Console.Write(d);
            Console.Read();
        }
    }
    static class A
    {
        public static double test(this double a,int d)
        {
            return Math.Round(a, d);
        }
    }
}

输出0.12

 


猜你喜欢
其他 9584 下的规则:(1)重写必须和被重写具有相同的列表,返回类型必须和被重写的返回类型相同或者是返回类型的子类型。(2)重写的访控制修饰符不能比被重写更严格(比如一个在父类中声明为pu
数据结构与算法 12622 描述给定一个int类型一维组a[],和一个int类型的b。编写一个程序,判断组中有没有两个(a[i],a[j])的和等于b,如果存在,返回两个在a组中的下表
数据结构与算法 9802 描述思路:斐波那契列的变体考虑如果把20190324项的每一项的都算出来的话,那么的范围就会超出基本据类型能够表示的范围,又考虑到目是求最后四位,而加计算时前一位不会影响后一位的计
数据结构与算法 12867 据结构-图的着色描述:图的m-着色判定——给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色使G中任意相邻的2个顶点着不同颜色?个人感
数据结构与算法 1846 约瑟夫环描述有m个人,围成一个环,编号为1、2、3、、、m,从第一个人开始循环报(从1开始),假设到n的那个人出局,然后从下一个人继续(从1开始),到n出列,以此循环,最后那个人为
框架 3778 mybatis使用接口的时候注意不能重载1.单个publicUsersselectUser(intid);selectid="selectUser"resultType
数据结构与算法 7014 描述:渗透,给一个n*m的矩阵,0为空白,1为白纸,2为墨水,墨水每经过每一秒会将上下左右相邻的白纸染成黑色,然后继续渗透,判断此图中的白纸最终是否能够全部被墨水染上色,若能需要输出所有白纸
数据结构与算法 7824 、同一列或同一斜线上,有多少种摆。1.案1:用二维组表示棋盘,回溯搜索/***回溯,深度优先搜索,递归*@authorLENOVO**/publicclass八皇后{ publicstatic
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。