ref和out都对函数参数采用引用传递形式——不管是值类型参数还是引用类型参数,并且定义函数和调用函数时都必须显示生命该参数为

ref/out形式。两者都可以使函数传回多个结果。

两者区别:

两种参数类型的设计思想不同,ref的目的在于将值类型参数当作引用型参数传递到函数,是函数的输入参数,并且在函数内部的任何改变也

都将影响函数外部该参数的值;而out的目的在于获取函数的返回值,是输出参数,由函数内部计算得到的值再回传到函数外部,因此必须在

函数内部对该参数赋值,这将冲掉函数外部的任何赋值,使得函数外部赋值毫无意义。

表现为:

1、out必须在函数体内初始化,这使得在外面初始化变得没意义。也就是说,out型的参数在函数体内不能得到外面传进来的初始值。
2、ref必须在函数体外初始化。
3、两者在函数体内的任何修改都将影响到函数体外面。

例:

using System;

namespace ConsoleApplication1
{
class C
{
public static void reffun(ref string str)
{
str += " fun";
}

public static void outfun(out string str)
{
str = "test"; //必须在函数体内初始, 如无此句,则下句无法执行,报错
str += " fun";
}
}

class Class1
{
[STAThread]
static void Main(string[] args)
{
string test1 = "test";
string test2; //没有初始
C.reffun( ref test1 ); //正确
C.reffun( ref test2 ); //错误,没有赋值使用了test2
C.outfun( out test1 ); //正确,但值test无法传进去
C.outfun( out test2 ); //正确

Console.Read();
}
}
}

params 关键字可以指定在参数数目可变处采用参数的方法参数。

在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。

The params keyword lets you specify a method parameter that takes an argument where the number of arguments is variable.

No additional parameters are permitted after the params keyword in a method declaration, and only one params keyword is

permitted in a method declaration.

// cs_params.cs
using System;
public class MyClass
{

public static void UseParams(params int[] list)
{
for (int i = 0 ; i < list.Length; i++)
{
Console.WriteLine(list[i]);
}
Console.WriteLine();
}

public static void UseParams2(params object[] list)
{
for (int i = 0 ; i < list.Length; i++)
{
Console.WriteLine(list[i]);
}
Console.WriteLine();
}

static void Main()
{
UseParams(1, 2, 3);
UseParams2(1, 'a', "test");

// An array of objects can also be passed, as long as
// the array type matches the method being called.
int[] myarray = new int[3] {10,11,12};
UseParams(myarray);
}
}

Output

1
2
3

1
a
test

10
11
12

c#中out、ref和params的用法与区别相关推荐

  1. python中sort和sorted区别_Python中的 sort 和 sorted的用法与区别

    今天在做一道题时,因为忘了Python中sort和sorted的用法与区别导致程序一直报错,找了好久才知道是使用方法错误的问题!现在就大致的归纳一下sort和sorted的用法与区别 1. sort: ...

  2. hive replace替换多个_详解Mysql数据库中replace与replace into的用法及区别

    概述 Mysql数据库replace与replace into都是经常会用到的功能:replace其实是做了一次update操作,而不是先delete再insert:而replace into其实与i ...

  3. PGSQL中distinct和distinct on的用法与区别

    1.distinct是按照列去重 语法是: select distinct 列名[, 列名...] from 表名 使用distinct关键字查询时,是去掉某一(多)列中重复的值. 举个例子,比如我们 ...

  4. 字符串中size()、length()与sizeof()用法及区别

    1.string中的size()和length()计算字符串中真实有意义的字符的长度 字符串的size()函数返回字符串的长度,不包括结束符'\0'; string a = "abcd&qu ...

  5. jQuery中wrap、wrapAll和wrapInner用法以及区别

    原文转自:http://blog.sina.com.cn/s/blog_780a942701015nac.html 原文: <ul>   <lititle='苹果'>苹果< ...

  6. Linux中wget、yum与apt-get用法及区别

    一般来说著名的linux系统基本上分两大类: RedHat系列:Redhat.Centos.Fedora等 Debian系列:Debian.Ubuntu等 RedHat 系列 常见的安装包格式 rpm ...

  7. matlab repmate,MATLAB中“repmat”与“cat”函数的用法

    MATLAB中"repmat"与"cat"函数的用法 1. repmat函数 >> z=repmat(5,2,3) z = 5 5 5 5 5 5 ...

  8. java removeat,在c#中 RemoveAt、 Remove、delete用法区别

    有三种方法可以删除 DataTable 中的 DataRow: Delete 方法和 Remove 方法和 RemoveAt 方法 其区别是: Delete 方法实际上不是从 DataTable 中删 ...

  9. Vue3 理解 toRef 和 toRefs 的作用、用法、区别

    toRef / toRefs 作用 toRef 和 toRefs 可以用来复制 reactive 里面的属性然后转成 ref,而且它既保留了响应式,也保留了引用,也就是你从 reactive 复制过来 ...

最新文章

  1. ecs安装tomcat和mysql_centos(Linux)系统阿里云ECS搭建 jdk,tomcat和MySQL环境,并部署web程序...
  2. 校园音乐点歌平台的设计与开发 微信小程序 点歌系统 java 开发
  3. 千万级饿了么交易系统架构 5 年演化史!
  4. 16 美元,黑客就能截获你的短信?
  5. 虚幻4的关卡动态加载机制
  6. linux查看终端进程,Linux查看进程
  7. STIMULUS(二) —— Hello, Stimulus
  8. leetcode283.移动零
  9. SharePoint学习札记[6] — WebPart之基础
  10. python架构图教程_Python 五分钟绘制漂亮的系统架构图
  11. 模型计算量(FLOPs)和参数量(Params)的理解
  12. HDU 5514 Frogs (容斥原理)
  13. 框架的配置文件的映射机制
  14. 关于常用STM32F103芯片型号代码
  15. 利用梦网云通讯实现 短信 验证码 发送 附带教程~~~
  16. 两种智能小车的建模与仿真
  17. 数据结构算法书籍推荐
  18. Jenkins自动集成
  19. [转载]使用 Apache Geronimo 和 JMS 构建事件驱动的框架
  20. 苹果 M1“痛失”Windows 11!

热门文章

  1. php的一些不安全函数,php中可能会产生安全问题一些函数
  2. python中输出菱形_用python打印菱形的实操方法和代码
  3. PREFACE FPGA经典案例序言
  4. 用户域名注册后 需要在租服务器吗,申请域名并缴费后,是不是还需要一个服务器,那怎么建服务器呢...
  5. 什么是python的第三方库_python学习(十九)常见的第三方库
  6. js写的程序如何上线到linux,将 Node.js 应用发布到 Linux 应用服务 - Visual Studio | Microsoft Docs...
  7. java百度地图添加标注_调取百度地图接口,实现取自己的实时位置,然后可以在百度地图上添加信息标注...
  8. 大学生php实训心得1500_【有奖征文】第五届大学生国际学术研讨会
  9. 后处理安装_核燃料后处理设施中的热室
  10. 电视看板实现原理_电脑显示器如何改装成电视机?详细改装方法,修电脑师傅告诉你...