C# 方法(输出参数)

发布于:2025-05-09 ⋅ 阅读:(22) ⋅ 点赞:(0)

本章内容:
方法的结构
方法体内部的代码执行
局部变量
局部常量
控制流
方法调用
返回值
返回语句和void方法
局部函数
参数
值参数
引用参数
引用类型作为值参数和引用参数
输出参数
参数数组
参数类型总结
方法重载
命名参数
可选参数
栈帧
递归

输出参数

输出参数用于从方法体内把数据传出到调用代码,它们的行为与引用参数类似。如同引用参
数,输出参数有以下要求。

必须在声明和调用中都使用修饰符。输出参数的修饰符是out而不是ref。
和引用参数相似,实参必须是变量,而不能是其他类型的表达式。这是有道理的,因为
方法需要内存位置来保存返回值。
例如,下面的代码声明了名为MyMethod的方法,它带有单个输出参数。

void MyMethod(out int val) //方法声明
{....}

...
int y=1;                   //实参变量
MyMethod(out y);           //方法调用

image

与引用参数类似,输出参数的形参充当实参的别名。形参和实参都是同一块内存位置的名称。
显然,在方法内对形参做的任何改变在方法执行完成之后(通过实参变量)都是可见的。

与引用参数不同,输出参数有以下要求。
在方法内部,给输出参数赋值之后才能读取它。这意味着参数的初始值是无关的,而且
没有必要在方法调用之前为实参赋值。
在方法内部,在方法返回之前,代码中每条可能的路径都必须为所有输出参数赋值。

因为方法内的代码在读取输出参数之前必须对其写入,所以不可能使用输出参数把数据传入
方法。事实上,如果方法中有任何执行路径试图在方法给输出参数赋值之前读取它的值,编译器
就会产生一条错误消息。

public void Add2(out int outValue)
{
    int var1=outValue+2;//出错了,在方法赋值之前无法读取输出变量
}

例如,下面的代码再次展示了方法mymethod,但这次使用了输出参数。

class MyClass
{
    public int Val=20;      //字段初始化
}

class Program 
{
    static void MyMethod(out MyClass f1,out int f2)
    {
        f1=new MyClass();   //创建一个类变量
        f1.Val=25;          //赋值类字段
        f2    =15;          //赋值int参
    }

    static void Main()
    {
        MyClass a1=null;
        int a2;

        MyMethod(out a1,out a2);//调用方法
    }
}

图6-11阐述了在方法执行的不同阶段中实参和形参的值。
在方法调用之前,将要被用作实参的变量a1和a2已经在栈里了。
在方法的开始,形参的名称被设置为实参的别名。你可以认为变量a1和f1指向的是相同
的内存位置,也可以认为a2和f2指向的是相同的内存位置。a1和a2不在作用域之内,
所以不能在MyMethod中访问。
在方法内部,代码创建了一个MyClass类型的对象并把它赋值给f1。然后赋一个值给千f1
的字段,也赋一个值给f2。对fl和f2的赋值都是必需的,因为它们是输出参数。
方法执行之后,形参的名称已经失效,但是引用类型的a1和值类型的a2的值都被方法内
的行为改变了。

对于输出参数,形参就好像是实参的别名一样,但是还有一个要求,那就是
它必须在方法内进行赋值

从C#7.0开始,你不再需要预先声明一个变量来用作out参数了。你可以在调用方法时在参
数列表中添加一个变量类型,它将作为变量声明。

例如,在之前的代码示例中,Main方法声明了a1和a2变量,然后在调用MyMethod时将它
们用作out参数,如下所示:

static void Main()
{
    MyClass a1=null;     //声明用作out参数的变量
    int a2;              //声明被用作out参数的变量

    MyMethod(out a1,out a2);//调用方法
}

如果使用新的语法,你可以:
消除显式的变量声明;
直接在方法调用时加入变量类型声明。
下面的代码演示了新的形式:

static void Main()
{
    MyMethod(out MyClass a1,out int a2);//调用方法
}

虽然a1和a2只在方法调用语句中进行了声明,但它们也可以在方法调用完后继续使用,
如以下代码所示:

static void Main()
{
    MyMethod(out MyClass a1,out int a2);//调用方法
    Console.WriteLine(a2);              //使用返回的值

    a2+=5;                              //写入变量
    Console.WriteLine(a2);
}

网站公告

今日签到

点亮在社区的每一天
去签到