C#方法参数传递-同时使用ref和out关键字

在方法参数传递中,可以同时使用ref和out关键字,但是要注意ref和out参数传递的不同。

using System;
class Program
{
static void Main()
{
    Program obj = new Program();
    int score = 55; //声明原来分数
    int refscore, outscore; //声明两个变量
    obj.ChangeScore(score, ref refscore, out outscore);
    Console.WriteLine("您原来的分数是{0},调整后的分数为{1},加平时表现分后{2}",
      score, refscore, outscore);
    Console.ReadKey();
}
private void ChangeScore(int score, ref int refscore, out int outscore)
{
    if (score > 50 && score < 60)
    {
      refscore = 60;
    }
    if (refscore > 60)
    {
      outscore = refscore + 5;
    }
}
}

以上代码编译时会出现两个错误,我们只声明了变量refscore,并没有给变量显示赋值。所以出现第一个错误:使用了未赋值的局部变量“refscore”。out关键字传递参数时,必须被调用方法内修改参数,用if语句判断,只有符合条件的out参数赋值,不符合条件的out参数没有赋值,所以出现了“控制离开方法之前必须对out参数outscore赋值”错误。

using System;
class Program
{
static void Main()
{
    Program obj = new Program();
    int score = 55; //声明原来分数
    int refscore = 0, outscore; //声明两个变量
    obj.ChangeScore(score, ref refscore, out outscore);
    Console.WriteLine("您原来的分数是{0},调整后的分数为{1},加平时表现分后{2}",
      score, refscore, outscore);
    Console.ReadKey();
}
private void ChangeScore(int score, ref int refscore, out int outscore)
{
    if (score > 50 && score < 60)
    {
      refscore = 60;
    }
    if (refscore > 60)
    {
      outscore = refscore + 5;
    }
    else
    {
      outscore = refscore;
    }
}
}

以下内容供参考:

一、值参数与引用参数及输出参数的区别:
1、值参数中实参的值不随形参值变更而变更;
形参与实参值互不影响,实参传递给形参时,栈中就为其分配另外一部分空间。这样,两个参数变更时而互不影响。
2、引用参数及输出参数中实参的值会随形参值变更而变更;
(形参:在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。只有在发生函数调用时,函数中形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。调用时将实参的值赋绐形参);
引用参数与输出参数中,实参在栈中分配空间。当实参传递给形参时,会将地址传递给形参,即传送的指针,这样形参变更时,实参也会随著变更。

二、引用参数与输出参数区别:
1、使用ref与out参数时,方法中参数及调用参数都需要加Ref或out关键字。
2、使用ref参数与out参数得到的结果是一样的,区别是:ref在调用前需给调用方法中的参数赋初值。out在调用前不需给调用方法中的参数赋初值,参数在实际方法体中初始化。

时间: 2024-10-11 01:28:16

C#方法参数传递-同时使用ref和out关键字的相关文章

关于c#中”ref”和”out”关键字的一些理解

一. 综述(本文内容大部分来自网络,经本人整理而成,仅供学习参考,不免理解错误,欢迎批评指正) 在c#中,方法的参数传递有四种类型: (1) 传值参数(by value) 传值参数无需额外的修饰符.传值参数在方法调用过程中,如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此而改变,而是保持原来传入的值.实际 上,传值参数传递的是调用参数的一份拷贝,因此在调用方法的过程中,即使改变了参数的值,也不会影响到实际传入的参数值,详见例程: (2) 传址参数(by reference) 传址

C# ref与out关键字解析

简介:ref和out是C#开发中经常使用的关键字,所以作为一个.NET开发,必须知道如何使用这两个关键字. 1.相同点 ref和out都是按地址传递,使用后都将改变原来参数的数值. 2.ref关键字 (1).使用ref关键字的注意点: i.方法定义和调用方法都必须显式使用 ref 关键字 ii.传递到 ref 参数的参数必须初始化,否则程序会报错 iii.通过ref的这个特性,一定程度上解决了C#中的函数只能有一个返回值的问题 (2).代码示例: using System; using Syst

REF和OUT关键字的介绍

声明:本文是本人最初写在51CTO上的一篇学习笔记,原文地址为:http://kestrelsaga.blog.51cto.com/3015222/717906 ref与out的比较: ref与out关键字都是使参数通过引用来传递的,不同的是ref 要求变量必须在传递之前进行初始化,而out 的参数在传递之前不需要显式初始化. 在使用ref或out参数,方法定义和调用方法都必须显式使用ref或out关键字,如: 例1(out): 01.class OutExample 02.{ 03. stat

C# 使用ref和out关键字

使用ref关键字,可以使参数按引用传递.当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中.若要使用ref关键字进行参数传递,则方法定义和调用方法都必须显示地使用ref关键字,而且使用ref关键字传递的参数必须最先进行初始化.使用out关键字的方法与使用ref关键字的方法类似,同样会导致参数通过引用来传递.不同之处在于,使用out关键字传递的参数并不需要最先进行初始化,但需要在方法返回之前进行赋值.若要使用out关键字传递参数,方法定义和调用方法都必须显示地使用out关键字.

方法参数(params,ref,out)

params 使用该关键字可以指定采用数目可变的参数的方法参数,可以发送参数声明中所指定类型的逗号分隔的参数列表或指定类型的参数数组,还可以不发送参数,如果未发送任何参数,则params列表的长度为0 在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字 public class MyClass { public static void UseParams(params int[] list) { for (int i = 0; i < l

C#方法中的ref和out

ref        通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不将受到影响.此外我们还有其他向方法传递参数的形式,引用(ref)和输出(out).    有时,我们需要改变原来变量中的值,这时,我们可以向方法传递变量的引用,而不是变量的值.引用是一个变量,他可以访问原来变量的值,修改引用将修改原来变量的值.变量的值存储在内存中,可以创建一个引用,他指向变量在内存中的位置.当引用被修改时,修改的是内存中的值,因此变量

Python Special Syntax 10:列表综合,不定数参数传递(C#的params关键字)

列表综合 参见:http://woodpecker.org.cn/abyteofpython_cn/chinese/ch15s03.html #-*-coding:utf-8 def ttt(value1,*args): for i in args: value1+=i print(value1) def tt2(**args): iSum=args['a']+args['b'] print iSum ttt(10,1,2,3,4) tt2(a=3,b=4) 输出:207 Python Spec

myBatis,mapper查询方法参数传递出错

myBatis,mapper查询方法参数传递出错 接口类mapper的方法: public string getData(String str); mapper.xml文件中sql语句: select * from table1 t where t.str=#{str} 这样可能会报错,报错内容是找不到参数str; 把接口类mapper中的方法参数修改一下: public string getData(@Param(value = "str") String str); 就不报错了

String作为方法参数传递 与 引用传递

String作为方法参数传递 String 和 StringBuffer的区别见这里: http://wenku.baidu.com/view/bb670f2abd64783e09122bcd.html 一. 最开始的示例写代码最重要的就是实践,不经过反复试验而得出的说辞只能说是凭空遐想罢了.所以,在本文中首先以一个简单示例来抛出核心话题: public class StringAsParamOfMethodDemo { public static void main(String[] args