`
java-mans
  • 浏览: 11339673 次
文章分类
社区版块
存档分类
最新评论

C#的参数类型:params、out和ref

 
阅读更多

首先回顾一下C#声明一个方法的语法和各项元素,[]代表可选
[访问修饰符] 返回值 方法名([参数类型] 数据类型 参数名)
{方法体}

这篇文章主要是为了讲解 参数表里面的可选项[参数类型],这个参数类型的设置会影响到我们对参数施加操作后的结果或影响我们对方法的调用方式。

C#之中参数类型分为4种:
无:默认的,普通参数
params:不定长参数
out:输出变量
ref:引用传递

普通参数,当参数是值类型时传值,当参数为引用类型时传址,这个由于各类C#的书都一定会讲,此处略过。

params类型的参数搭配数组使用,实现一个不定长的数组参数
最常用的应该是Console.WriteLine,其中有一个重载如下:
public static void WriteLine(string FormatString, params object[] values);
常见的调用方式:Console.WriteLine("宽:{0},高:{1}",this.Width,this.Height);
前面的"宽:{0},高:{1}"被装入FormatString
this.Width,this.Height被装入values[0]和values[1]之中,如果我们再加几个参数上去,那将按下标继续存入数组中

out类型的参数做为输出参数使用,用于一个方法返回多个值类型的变量,一般对值类型使用。
定义方法:
void Test(out int v1,out float v2)
{
v1 = 1;
v2 = 0.5f;
}
调用方法:
int a;
float b;
Test(out a,out b);
基本上和Sql Server的output参数一样

ref类型的参数是指在将一个变量做为一个参数传递给某个方法的时候,使用引用传递。
如果变量是值类型的话,ref和out起的效果是一样,只是ref参数在使用前必须先赋值,而out不用。
定义方法:
void Test(ref int v1,ref float v2)
{
v1 = 1;
v2 = 0.5f;
}
调用方法:
int a = 0;
float b = 0;
Test(ref a,ref b);
---------------------华丽的分隔线---------------------
ref比较容易混淆的地方在于如果参数是引用类型的变量时,处理的结果与直接传一个引用类型变量有什么区别?
测试类:
public class Class1
{
public int X = 0;
public int Y = 5;
}
定义方法:
private void Test(Class1 c)
{//直接传引用类型
c.Y = 10;
c.X = 10;
//非ref传递,这句改不了引用的内存空间
c = new Class1();
}
private void Test(ref Class1 c)
{//通过ref传引用,允许被调用的方法修改 该引用 所 引用的对象,因为引用本身是按引用来传递的。
c.Y = 10;
c.X = 10;

//c通过ref传递,这里c会变成一个新的Class1
c = new Class1();
}
调用方法:
Class1 a = new Class1();
Test(a);
Console.WriteLine("X:{0},Y:{1}",a.X,a.Y);
Class1 b = new Class1();
Test(ref b);
Console.WriteLine("X:{0},Y:{1}",b.X,b.Y);
输出结果:
X:10,Y:10
X:0,Y:5
通过输出结果我们可以看到使不使用ref的区别
用ref的话,c可以更改指向,从而放弃它原来所引用的那块内存空间
如果不用的话,只能改c内存空间中的数据,不可以更改指向。

分享到:
评论

相关推荐

    C#中ref,out和params有什么区别

    C#中ref,out和params有什么区别 out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out ...

    WebServiceRef, Out, Params

    Remoting和WebServiceRef, Out, Params的区别

    详解C#中三个关键字params,Ref,out

    本文主要讨论params关键字,ref关键字,out关键字。非常不错,具有参考借鉴价值,需要的朋友参考下吧

    asp.net(c#)ref,out ,params的区别

    C#中有三个关键字-ref,out ,params,虽然本人不喜欢这三个关键字,因为它们疑似破坏面向对象特性。但是既然m$把融入在c#体系中,那么我们就来认识一下参数修饰符ref,out ,params吧,还有它们的区别。

    C#程序设计复习题.doc

    5、使用ref关键字和out关键字都是通过引用传递参数,不同的是ref方式要求实参必须 在传递之前进行__________。而采用out方式时不要求在调用方法前对实参进行____ ______。 6、静态方法只能访问类中的 ________ 字段...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    12.7.1 泛型方法和类型推断 12.8 泛型和其他成员 12.9 可验证性和约束 12.9.1 主要约束 12.9.2 次要约束 12.9.3 构造器约束 12.9.4 其他可验证性问题 第13章 接口 13.1 类和接口继承 13.2 定义接口 13.3 ...

    在一小时内学会 C#(txt版本)

    注意:C# 的类型范围和 C++ 不同。例如:long 在 C++ 中是 4 字节而在 C# 中是 8 字节。bool 和 string 类型均和 C++ 不同。bool 仅接受真、假而非任意整数。 用户定义类型文件包含: 1. 类 (class) 2. 结构...

    C#考试简答题总结 (2).docx

    1. C#语言特点 2. C#程序特点 3.枚举型与结构型的区别 3. 数据类型转换 4. break与continue 5. 访问修饰符 6. 类与对象 ...22. C#函数中无参数修饰符、out修饰符、params修饰符、ref修饰符的区别?

    Untiy C#参数修饰符

    简单的学习一下C# 参数的修饰符!!

    c#学习笔记.txt

    指定声明的类型和类型成员的可访问性。 访问不受限制 只有包含该类的成员的类可以访问 只有当前工程可以访问 只有包含该成员的类和继承的类可以访问 abstract指示某个类只能是其他类的基类。 const指定无法修改字段...

    C#入门——面向对象等,代码+注释

    第6天 01方法调用 判断是否为整数 yes或no 02方法练习求数组的和 03方法 out参数求数组的和 04 out参数练习 05 out练习 06 ref参数 07 ref 参数练习 08 params 可变参数 09方法的重载 10方法的递归 11方法练习 ...

    CLR.via.C#.(中文第3版)(自制详细书签)

    27.8.4 为BeginXxx和EndXxx方法使用ref,out和params实参 27.8.5 不能取消异步I/O限制操作 27.8.6 内存消耗 27.8.7 有的I/O操作必须同步完成 27.8.8 FileStream特有的问题 27.9 I/O请求优先级 27.10 将...

    鹏哥特色教程之C#入门到精通 基础篇 2/2

    23.方法的参数(ref,out,params) 24.类的继承 20.完善我的留言板(2) 21.完善我的留言板(3) 22.完善我的留言板(4) 25.异常处理 26.命名空间 27.接口 28.泛型 29.抽象类 30.访问限制关键字 31.所有的类的父类 32.委托 ...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    3.4.3 消除可选参数和命名参数的歧义 59 第3章快速参考 63 第4章 使用决策语句 65 4.1 声明布尔变量 65 4.2 使用布尔操作符 66 4.2.1 理解相等和关系操作符 66 4.2.2 理解条件逻辑操作符 66 4.2.3 短路求值 ...

    C#部分基础知识整理

    C# 中的yield、ref、out、params关键字理解.并有代码测试。 C#预处理指令(未做测试例子)。 对C# 中堆栈,堆,值类型,引用类型的理解。

    C# for CSDN 乱七八糟的看不懂

    C#关键字 关键字 abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach ...

    Visual.C#.编程精彩百例

    实例9 Ref、Out与Params描述符的应用 实例10 C#自动内存管理的应用 实例11 一个有趣栈类的实现 实例12 垃圾收集器管理与应用 实例13 垃圾收集器算法控制与使用 实例14 调用栈记录异常点 实例15 使用C#异常的栈...

Global site tag (gtag.js) - Google Analytics