现在的位置: 首页 > 综合 > 正文

方法的参数【C#】

2014年09月03日 ⁄ 综合 ⁄ 共 2526字 ⁄ 字号 评论关闭
ô1.值参数
在方法声明时不加修饰的形参就是值参数,它表明实参与形参之间按值传递。当这个方法被调用时,编译器为值参数分配存储单元,然后将对应的实参的值复制到形参中。实参可以是变量、常量、表达式,但要求其值的类型必须与形参声明的类型相同或能够被隐式地转化为这种类型。这种传递方式的好处是,在方法中对形参的修改不影响外部的实参,也就是说,数据只能传入方法而不能从方法传出,所以值参数有时也被称为入参数。
ô2.引用参数
如果调用一个方法,期望能够对传递给它的实际变量进行操作,用C#默认的按值传递是不可能实现的。所以C#用ref修饰符来解决此类问题,它告诉编译器,实参与形参的传递方式是引用。
引用参数与值参数不同,引用参数并不创建新的存储单元,它与方法调用中的实在参数变量同处一个存储单元中。因此,在方法内对形参的修改就是对外部实参变量的修改。
ô3.输出参数
在参数前加out修饰符的被称为输出参数,它与ref参数相似,只有一点除外,就是它只能用于从方法中传出值,而不能从方法调用处接收实参数据。在方法内out参数被认为是未赋过值的,所以在方法结束之前应该对out参数赋值。
ô4.参数数组
一般而言,调用方法时其实参必须与该方法声明的形参在类型和数量上相匹配,但有时我们更希望灵活一些,能够给方法传递任意个数的参数。比如,在3个数中找最大值、最小值和在5个数中找最大值、最小值,甚至在任意多个数中找最大值、最小值能使用同一个方法。C#提供了传递可变长度参数表的机制,使用params关键字来指定一个可变长的参数表。

从工具箱中拖曳一个“Button”控件、一个“TextBox”控件和一个“Label”控件到窗体上。
“TextBox”控件的“Multiline”属性设置为“True”。

在此类中定义4种不同的方法并分别使用“值参数”、“引用参数”、“输出参数”和“参数数组”参数传递形式实现查找最大值。

namespace Test
{
    class Method
    {
        //值参数方法
        public int  method_1(int x,int y,int z)
//将对应的实参的值复制到形参中
        {
            int t;
            //将x,y,z从大到小排序
            if (x < y) { t = x; x = y; y = t; }
            if (x < z) { t = x; x = z; z = t; }
            if (y < z) { t = y; y = z; z = t; }
            return x;
        }
        //引用参数方法
        public void method_2( ref int x,ref  int y,ref  int z)
//在方法内对形参的修改就是对外部实参变量的修改
        {
            int t;
            //将x,y,z从小到大排序
            if (x > y) { t = x; x = y; y = t; }
            if (x > z) { t = x; x = z; z = t; }
            if (y > z) { t = y; y = z; z = t; }
        }
        
        //输出参数方法
        public void method_3(int x,  int y, int z,out
int max) //只能用于从方法中传出值,方法结束之前应该对out参数赋值
        {
            int t;
            //将x,y,z从小到大排序
            if (x > y) { t = x; x = y; y = t; }
            if (x > z) { t = x; x = z; z = t; }

            if (y > z) { t = y; y = z; z = t; }

            max = z;
        }
        //参数数组方法
        public void method_4(out int max, params int[] arr
//使用params关键字来指定一个可变长的参数表

        {
            max = arr[0];
            for (int i = 1; i < arr.Length; i++)
            {
                if (arr[i] > max)
                {
                    max = arr[i];
                }
            }
        }
    }
}

namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Random r = new Random();
            int[] array = { r.Next(100), r.Next(100), r.Next(100) };
            label1.Text ="随机数1:"+ array[0].ToString()+ "\r\n随机数2:"+array[1].ToString() +"\r\n随机数3:"+ array[2].ToString();

            int Max;
            Method method = new Method();
            Max = method.method_1(array[0], array[1], array[2]);
            textBox1.Text = "值参数方法,最大值:"+Max.ToString()+"\r\n";

            method.method_2(ref array[0],ref
array[1],ref array[2]);
            textBox1.Text += "引用参数方法,最大值:" + array[2].ToString() + "\r\n";

            method.method_3(array[0],array[1], array[2],out Max);
            textBox1.Text += "输出参数方法,最大值:" + Max.ToString() + "\r\n";

            method.method_4(out Max,array);
            textBox1.Text += "数组参数,最大值:" + Max.ToString() + "\r\n";
        }
    }
}

【上篇】
【下篇】

抱歉!评论已关闭.