`
流星剑
  • 浏览: 95992 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C#中使用ref和out一点认识!

    博客分类:
  • .net
阅读更多

ref 
通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不将受到影响.此外我们还有其他向方法传递参数的形式,引用(ref)和输出(out).
有时,我们需要改变原来变量中的值,这时,我们可以向方法传递变量的引用,而不是变量的值.引用是一个变量,他可以访问原来变量的值,修改引用将修改原来变量的值.变量的值存储在内存中,可以创建一个引用,他指向变量在内存中的位置.当引用被修改时,修改的是内存中的值,因此变量的值可以将被修改.当我们调用一个含有引用参数的方法时,方法中的参数将指向被传递给方法的相应变量,因此,我们会明白,为什么当修改参数变量的修改也将导致原来变量的值.
创建参数按引用传递的方法,需使用关键字ref.例;
using System;
class gump
{
public double square(ref double x)
{
x=x*x;
return x;
}
}
    
class TestApp
{
public static void Main()
{
gump doit=new gump();
    
double a=3;
double b=0;
    
Console.WriteLine("Before square->a={0},b={1}",a,b);
    
b=doit.square(ref a);
Console.WriteLine("After square->a={0},b={1}",a,b);
}
}
    
通过测试,我们发现,a的值已经被修改为9了.
    
out
通过指定返回类型,可以从方法返回一个值,有时候(也许还没遇到,但是我们应该有这么个方法),需要返回多个值,虽然我们可以使用ref来完成,但是C#专门提供了一个属性类型,关键字为out.介绍完后,我们将说明ref和out的区别.
using System;
class gump
{
public void math_routines(double x,out double half,out double squared,out double cubed)
//可以是:public void math_routines(//ref double x,out double half,out double squared,out double cubed)
//但是,不可以这样:public void math_routines(out double x,out double half,out double squared,out double cubed),对本例来说,因为输出的值要靠x赋值,所以x不能再为输出值
{
half=x/2;
squared=x*x;
cubed=x*x*x;
}
}
    
class TestApp
{
public static void Main()
{
gump doit=new gump();
    
double x1=600;
double half1=0;
double squared1=0;
double cubed1=0;

/*
double x1=600;
double half1;
double squared1;
double cubed1;
*/
    
Console.WriteLine("Before method->x1={0}",x1);
Console.WriteLine("half1={0}",half1);
Console.WriteLine("squared1={0}",squared1);
Console.WriteLine("cubed1={0}",cubed1);
    
doit.math_rountines(x1,out half1,out squared1,out cubed1);

Console.WriteLine("After method->x1={0}",x1);
Console.WriteLine("half1={0}",half1);
Console.WriteLine("squared1={0}",squared1);
Console.WriteLine("cubed1={0}",cubed1);
}
}
    
通过使用out关键字,我们改变了三个变量的值,也就是说out是从方法中传出值.
    
我们发现,ref和out似乎可以实现相同的功能.因为都可以改变传递到方法中的变量的值.但是,二者本质本质的区别就是,ref是传入值,out是传出值.在含有out关键字的方法中,变量必须由方法参数中不含out(可以是ref)的变量赋值或者由全局(即方法可以使用的该方法外部变量)变量赋值,out的宗旨是保证每一个传出变量都必须被赋值.
上面代码中被/**/注释掉的部分,可以直接使用.也就是说,在调用方法前可以不初始化变量.但是"x1"是要赋值的,否则要报错.而ref参数,在传递给方法时,就已经是还有值的了,所以ref侧重修改.out侧重输出.  

分享到:
评论

相关推荐

    c#程序员对TypeScript的认识过程.docx

    同样,C# 中的 `ref`, `out`, `in` 关键字在 TypeScript 中也不存在,但 TypeScript 提供了可选参数和默认参数值来弥补这一差距。 构造函数在 TypeScript 中与 C# 类似,但只能有一个默认构造函数。例如: ```...

    c#学习笔记.txt

    2. 在集合类中使用一个预定义的集合。 (2) throw 语句用于发出在程序执行期间出现反常情况(异常)的信号。throw 语句的形式为: throw [expression]; expression :异常对象。当在 catch 子句中再次引发当前异常...

    c#3.0完全参考手册

    - **C#语言的关键字**:列出C#中使用的保留关键字,如`class`、`if`等。 - **标识符**:命名变量、方法等的规则。 - **.NET Framework类库**:介绍.NET Framework提供的类库,包括System命名空间下的基本类。 #### ...

    c#程序员对TypeScript的认识过程

    此外,TypeScript没有C#的`ref`、`out`和`in`关键字,但支持默认参数和按名称访问参数。 【构造函数】: TypeScript仅允许一个构造函数,这与C#的单个实例构造函数相类似。构造函数用于初始化类的实例,例如: ```...

    《C#程序设计语言》知识点.doc

    《C#程序设计语言》知识点 本文档总结了《C#程序设计语言》的知识点,...* ref、out 关键字的使用 * 例子:void change(int i){i++;}public void test(){int a=100;change(a); Console.WriteLine(a);}控制台输出?100

    C#编程语言详解3(初学者,提高者通用)

    ### C#编程语言详解3(初学者,提高者通用) #### 概述 ...通过上述介绍,相信读者已经对C#的基本概念和高级特性有了较为全面的认识。接下来,建议通过实践项目进一步加深理解和运用这些知识点。

    asp.net3.5从入门到精通

    - **通过引用来传递参数**:探讨了如何使用ref和out关键字来传递引用类型。 - **方法的重载**:解释了方法重载的概念及其使用场合。 **3.6 封装** - **为什么要封装**:阐述了封装的重要性及其对软件设计的好处。 ...

Global site tag (gtag.js) - Google Analytics