ref 和out 关键字

  

  ref 和out 关键字

  

  通过对CLR的学习,我们可以知道,CLR默认所有方法参数都是传值的。对于引用类型的对象,传递的是对象的引用(指向对象的指针),被调用者拥有该对象的引用的拷贝,能够修改对象,改变对象的值;而对于值类型的实例来说,传递给的是实例的一个副本,被调用者对该副本所做的修改不会影响调用者中的实例。

  上面使用的是按传值方式来传递参数。接下来,讲按传引用的方式来传递参数。

  C# 中提供了 ref 和 out 关键字以便参数按引用(地址)传递,对值类型使用ref和out,为被调用者分配一个托管指针,该指针指向调用者的变量;对于引用类型的话,为被调用者分配一个托管指针,该指针指向调用者中的对象。

  

  补充一下代码,希望能够更加清晰点:

  

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace MyExamples.App
 8 {
 9     class Book {
10 
11         public String Name;
12 
13         /// <summary>
14         /// 按传值方式传递
15         /// </summary>
16         /// <param name="book"></param>
17         /// <param name="count"></param>
18         public void GetInfo(Book book, int count)
19         {
20             book.Name = "Eric";
21             count = 15;
22         }
23 
24         /// <summary>
25         /// 使用ref关键字按传引用传递
26         /// </summary>
27         /// <param name="book"></param>
28         /// <param name="count"></param>
29         public  void GetResultInfo(ref Book book, ref int count) {
30             book = new Book()
31             {
32                 Name = "jerry"
33             };
34             count = 10;
35         }
36 
37         /// <summary>
38         /// 输出结果
39         /// </summary>
40         /// <param name="book"></param>
41         /// <param name="count"></param>
42         public void GetResult(Book book, int count)
43         {
44             Console.WriteLine("book's Name is {0},Count is {1}", book.Name, count);
45         }
46 
47     }
48 
49     class Program
50     {
51         static void Main(string[] args)
52         {
53             Book book = new Book()
54             {
55                 Name = "jonish"
56             };
57 
58             int Count = 5;
59 
60             book.GetInfo(book, Count);
61             book.GetResult(book, Count);
62 
63             book.GetResultInfo(ref book, ref Count);
64             book.GetResult(book, Count);
65         }
66     }
67 }
View Code

  

  运行结果:

  

------------------------------------------------------------------------------------------------------------------------------------------------------

ref 和 out相同点:

1.使参数按引用传递,注意这里的“引用”与我们通常说的“对象引用”不一样,可以形象的理解为,类似于C/C++中传指针(地址)。

2.效果是,被调用方对该参数的修改会反映到该变量中,即当调用结束返回时,调用方看到的是修改过的值。

3.方法定义和调用方法都必须显式使用 ref 或者 out 关键字

ref 和 out不同点:

1。传递到 ref 的参数必须最先初始化,即由调用方显式初始化。

2。传递到 out 的参数在传递之前不需要显式初始化,但需要调用方在方法返回之前必须对其赋值。

 

方法重载时需要注意的地方:

1。ref 和 out 关键字在运行时的处理方式不同,但在编译时的处理方式相同。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。

2。但是,如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两类参数,则可以进行重载。

 

相关MSDN学习资料:

http://msdn.microsoft.com/zh-cn/library/14akc2c7(v=vs.80).aspx

http://msdn.microsoft.com/zh-cn/library/t3c3bfhx(v=vs.80).aspx

 

转载于:https://www.cnblogs.com/Jonish/p/2317562.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360540.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php-cli下载,php-cli-color

一个简单的 PHP 命令行 cli 输出彩色的类库安装composer require wujunze/php-cli-color ~1.0使用getColoredString("Testing Colors class, this is purple string on yellow background.", "purple", "yellow") . PHP_EOL;echo $colors->ge…

删除递归建立的文件

使用php的eclipse导入项目时不小心导致文件夹创建出现了恐怖的递归&#xff0c;创建了一个超级长的文件夹。删除时出现无法删除&#xff0c;指定的文件名无效或太长&#xff0c;资源管理器&#xff0c;或者命令行下del都用了&#xff0c;还是搞不定。曾尝试着一个个的改文件名并…

您会后悔对Lambdas应用重载!

编写好的API很难。 非常辛苦。 如果您想让用户喜欢您的API&#xff0c;则必须考虑很多事情。 您必须在以下两者之间找到适当的平衡&#xff1a; 有用性 易用性 向后兼容 前向兼容性 之前&#xff0c;在我们的文章&#xff1a; 如何设计良好的常规API中&#xff0c;我们已经…

java 匿名对象有引用,封闭对象的引用通过匿名类java进行转义

我在实践中阅读Java并发性,下面的例子来自于此.我的问题是这个参考逃脱是什么意思&#xff1f;会有什么问题&#xff1f; .这个引用是如何从doSomething(e)中逃脱的.public class ThisEscape {public ThisEscape(EventSource source) {source.registerListener(new EventListen…

7.25第一次组队赛

Problem A UVA 11877 The Coco-Cola Store 直接输出n/2 1 #include <stdio.h>2 int main()3 {4 int n;5 while(~scanf("%d",&n) && n)6 {7 printf("%d\n",n/2);8 }9 return 0; 10 } 也可以模拟 1 #include <stdio.h>2 int main()…

如何:优化Hive ZooKeeper Lock Manager实施

Hive一直使用ZooKeeper作为分布式锁定管理器来支持HiveServer2中的并发。 基于ZooKeeper的锁管理器在小型环境中运行良好。 但是&#xff0c;随着越来越多的用户从HiveServer迁移到HiveServer2并开始创建大量并发会话&#xff0c;可能会出现问题。 主要问题是Hiveserver2和ZooK…

java 类之间转换,java中类对象之间的类型转换

类似于基本数据类型之间的强制类型转换。存在继承关系的父类对象和子类对象之间也可以在一定条件之下相互转换。这种转换需要遵守以下原则&#xff1a;1.子类对象可以被视为是其父类的一个对象2.父类对象不能被当作是某一个子类的对象。3.如果一个方法的形式参数定义的是父类对…

重载和重写以及重写的权限问题

简单说重载是发生在一个类中 重写是发生在子父类中的继承情况中 重载Overloading 方法重载是让类以统一的方式处理不同类型数据的一种手段。具有同名函数同时存在&#xff0c;具有不同参数类型/个数。重载overloading是一个类中多态兴的一种表现。 java的方法重载&#xff0c;就…

《图解HTTP》第1章 了解Web及网络基础

《图解HTTP》第1章 了解Web及网络基础 1. 使用 HTTP 协议访问 Web1.1 网络基础 TCP/IP1.2 TCP/IP 协议族1.2.1 TCP/IP 的分层管理 1. 使用 HTTP 协议访问 Web Web 使用一种名为 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09; 的协议作为…

JBoss Forge NetBeans集成–入门

JBoss Forge是构建基于Maven的Java EE项目的最快方法。 因此&#xff0c;它已经具有了令人敬畏的功能&#xff0c;使您作为开发人员的生活更加轻松。 在大多数情况下&#xff0c;使用Forge的人们可能会对创建Web应用程序感兴趣。 有很多入门Forge基础的方法。 您可以查看quick…

java版本的getorcreate,getOrCreate for java-rest-api neo4j失敗

我有一個簡單的關係測試&#xff0c;我試圖運行使用Rest API創建一個獨特的節點(java-rest-binding)https://github.com/neo4j/java-rest-binding但不幸的是我被困在某些東西上&#xff0c;這裏是細節&#xff1a;(非唯一的節點和關係工作完全正常&#xff0c;與這一點&#xf…

Nifty JUnit:在方法和类级别上使用规则

如Nifty JUnit&#xff1a;使用临时文件一文中所示 &#xff0c;可以在JUnit测试中使用Rule &#xff0c;这是方法级别的规则。 在此示例中&#xff0c;我想显示ClassRule用于类级别规则的变体。 方法规则 Rule在测试类的每个测试方法&#xff08;就像Before &#xff09;之前…

SQL语法的重要知识点总结

好几年没写SQL语句了。现在到了新的team&#xff0c;需要用到数据库。作为QA的话时常需要使用客户端工具连接到数据库中找寻或修改数据。这么长时间没使用&#xff0c;一些SQL的使用技巧都忘得差不多了。晚上看了一些资料&#xff0c;花了1个多小时又捡起了曾经的知识。现在总结…

java语法定制混淆,由撇号混淆的textpad语法高亮显示

我想知道在textpad的语法文件中放置什么来修复问题&#xff0c;例如&#xff0c;在html文件中&#xff0c;你正在写一个段落&#xff0c;而撇号会创建语法高亮&#xff0c;直到下一个aspostrophe .例如&#xff1a;Hi, I m an example.lol text here placeholder lorem ipsum I…

您需要了解的有关默认方法的所有信息

因此&#xff0c;默认方法是……昨天的新闻&#xff0c;对不对&#xff1f; 是的&#xff0c;但是使用一年后&#xff0c;积累了很多事实&#xff0c;我想将这些事实收集在一个地方&#xff0c;供刚开始使用它们的开发人员使用。 甚至有经验的人都可以找到他们不知道的一两个细…

RAC+ASM在单机上恢复的过程

IT168技术文档】网上也有类似的例子&#xff0c;但不尽详细&#xff0c;也没多花心思解释流程及原因&#xff0c;可能对初试者不太解惑。有感于此&#xff0c;故认真整理了恢复步骤即操作流程&#xff0c;望有助于同行朋友。 环境&#xff1a;正式环境是IBM4IBM5(RAC)&#xf…

php event_base_new,php event拓展基本使用

php event拓展基本使用2019-02-04 22:02:28(527)1. 确定io复用类型(select/poll/epoll)php$cfg new EventConfig();$cfg->avoidMethod("select");$cfg->avoidMethod("epoll");$base new EventBase($cfg);$sig Event::signal($base, SIGTERM, func…

OSGi服务测试助手:ServiceRegistrationRule

OSGi服务测试可以有效避免与悬挂的服务引用有关的问题。 就像我在写简单服务贡献验证中所承诺的那样&#xff0c;这次我引入了一个JUnit规则 &#xff0c;该规则有助于测试组件之间的交互。 OSGi服务测试组件交互 假设我们有一个服务&#xff0c;该服务通知根据whiteboard-pat…

php 在函数里打开链接,JavaScript中打开链接的几种方法介绍

如何使用JavaScript打开链接&#xff1f;本篇文章我们就来看看使用JavaScript打开链接的几种方法介绍。我们先来看一段代码使用Javascript实现打开链接&#xff0c;需要在location.href中替换要打开的链接的URL。location.href http://www.php.cn/blog.html;通过上述代码我们可…

三代基因组测序技术原理简介

考虑到cnblog不适合基因组领域这种类型的文章&#xff0c; 最终&#xff0c;我自己开通了公众号&#xff1a;碱基矿工&#xff0c;欢迎感兴趣的同学关注&#xff01; 也可以关注我的知乎&#xff1a;https://www.zhihu.com/people/yellowtree/activities 2018年1月修改&#x…