当前位置: 首页 > news >正文

c#.net中参数修饰符ref,out ,params的区别

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

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

示例
// 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();
}

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

int[] myarray = new int[3] {10,11,12};
UseParams(myarray);
}
}
输出
1
2
3

1
a
test

10
11
12

===============================================
方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。
不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。
属性不是变量,不能作为 out 参数传递。
如果两个方法的声明仅在 out 的使用方面不同,则会发生重载。不过,无法定义仅在 ref 和 out 方面不同的重载。例如,以下重载声明是有效的:
class MyClass
{
public void MyMethod(int i) {i = 10;}
public void MyMethod(out int i) {i = 10;}
}
而以下重载声明是无效的:
class MyClass
{
public void MyMethod(out int i) {i = 10;}
public void MyMethod(ref int i) {i = 10;}
}
有关传递数组的信息,请参见使用 ref 和 out 传递数组。
示例
// cs_out.cs
using System;
public class MyClass
{
public static int TestOut(out char i)
{
i = 'b';
return -1;
}

public static void Main()
{
char i; // variable need not be initialized
Console.WriteLine(TestOut(out i));
Console.WriteLine(i);
}
}
输出
-1
b

========================================
方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。
传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。
属性不是变量,不能作为 ref 参数传递。
如果两种方法的声明仅在它们对 ref 的使用方面不同,则将出现重载。但是,无法定义仅在 ref 和 out 方面不同的重载。例如,以下重载声明是有效的:
class MyClass
{
public void MyMethod(int i) {i = 10;}
public void MyMethod(ref int i) {i = 10;}
}
但以下重载声明是无效的:
class MyClass
{
public void MyMethod(out int i) {i = 10;}
public void MyMethod(ref int i) {i = 10;}
}
有关传递数组的信息,请参见使用 ref 和 out 传递数组。
示例
// cs_ref.cs
using System;
public class MyClass
{
public static void TestRef(ref char i)
{
// The value of i will be changed in the calling method
i = 'b';
}

public static void TestNoRef(char i)
{
// The value of i will be unchanged in the calling method
i = 'c';
}

// This method passes a variable as a ref parameter; the value of the
// variable is changed after control passes back to this method.
// The same variable is passed as a value parameter; the value of the
// variable is unchanged after control is passed back to this method.
public static void Main()
{

char i = 'a'; // variable must be initialized
TestRef(ref i); // the arg must be passed as ref
Console.WriteLine(i);
TestNoRef(i);
Console.WriteLine(i);
}
}
输出
b
b

转载于:https://www.cnblogs.com/focustea/archive/2007/09/19/898380.html

相关文章:

  • 《JavaScript设计模式》——9.10 Factory(工厂)模式
  • 以太网帧格式、IP数据报格式、TCP段格式+UDP段格式 详解
  • webgis实现技术分析
  • 《Oracle数据库性能优化方法论和最佳实践》——第3章 流程分析之数据库登录流程 3.1 数据库登录导致业务系统性能恶化案例分享...
  • 《Cisco BGP-4 命令与配置手册》——导读
  • 《Tableau 8权威指南》—— 导读
  • 《Python和Pygame游戏开发指南》——2.8 关于函数、方法、构造函数和模块中的函数(及其差别)的一些提示...
  • DataFormatString 属性语法
  • 《树莓派渗透测试实战》——1.6 树莓派的优点和缺点
  • 在HttpHandlers中使用Session
  • 《机器人爱好者(第3辑)》——导读
  • 《Android 应用案例开发大全(第3版)》——第2章,第2.4节壁纸的实现
  • c#学习网址
  • 《敏捷软件开发:原则、模式与实践(C#版.修订版)》一1.4 参考文献
  • 分钱单算法
  • canvas 绘制双线技巧
  • Gradle 5.0 正式版发布
  • JavaScript-Array类型
  • Otto开发初探——微服务依赖管理新利器
  • Rancher如何对接Ceph-RBD块存储
  • spark本地环境的搭建到运行第一个spark程序
  • spring security oauth2 password授权模式
  • SQLServer之索引简介
  • 阿里云应用高可用服务公测发布
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 程序员该如何有效的找工作?
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 通过几道题目学习二叉搜索树
  • 因为阿里,他们成了“杭漂”
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • #1015 : KMP算法
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • **python多态
  • .gitattributes 文件
  • .Net mvc总结
  • .Net Remoting常用部署结构
  • .Net 高效开发之不可错过的实用工具
  • .NET大文件上传知识整理
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • ;号自动换行
  • ?.的用法
  • [AIGC] MySQL存储引擎详解
  • [android] 看博客学习hashCode()和equals()
  • [BUG] Authentication Error
  • [C++]二叉搜索树
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口
  • [Kubernetes]8. K8s使用Helm部署mysql集群(主从数据库集群)
  • [LeetCode 687]最长同值路径
  • [LeetCode]—Anagrams 回文构词法