热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ref和out的应用[转]

ref和out的应用要深刻理解ref和out的应用,不仅从语法的角度,更要从面向对象【OO】的角度去理解和把握。一、首先应该真正理解“方法”方法:1、语

refout的应用

 

 要深刻理解ref和out的应用,

不仅从语法的角度,更要从面向对象【OO】的角度去理解和把握。

 

一、首先应该真正理解“方法”

 

方法:

1、语法的角度:略

2、OO的角度:方法是对现实行为或操作的一种模拟

比如:学生的上课,考试,面试等行为都可以用方法来模拟,

【方法包含普通方法,虚方法,抽象方法,……】

 

二、这里我们要重点讨论方法的返回值

 

1、有些方法不需要返回值,比如:

实例1:我今天心情好,下班后去逛超市,但是不买任何东西

实例1分析:

 

方法构成

不需要花钱

方法无参数

不买任何东西

方法无返回值

实例1可以用以下方法来模拟

void 逛超市()

{

       //随意逛逛

}

 

2、有些方法需要返回值也需要参数,比如:

实例2:我今天下班后去超市买一箱牛奶

实例2分析:

 

方法构成

需要花*出*钱

方法有参数

买*回*一箱牛奶

方法有返回值

实例2可以用以下方法来模拟

int 逛超市(double 钱)

{

       //花*出*钱

       return 一箱牛奶;

}

 

三、ref ,out的用法

 

对于

实例2:我今天下班后去超市买一箱牛奶

实际我们有很多模拟的方式,如:方式1,方式2,方式3

 

方式1:用*有*参数*有*返回值的方法来模拟,如上

 

 

方法构成

需要花*出*钱

方法有参数,用一个参数{默认参数,传入值}

买*回*一箱牛奶

方法有返回值{用return返回值,传出值}

 

方式2:用*有*参数*没有*返回值的方法来模拟,让函数增加一个out参数,

让这个参数起到返回值的作用即传出值。

 

 

方法构成

需要花*出*钱

方法有参数, 一个为默认参数  {传入值}

             另一个为out参数{传出值}

买*回*一箱牛奶

方法有返回值{不用return返回值,

而用out参数返回值,传出值}

 

实例2还可以用以下方法来模拟:

void 逛超市(float 钱, out  int 买的东西)

{

       //花*出*钱

       买的东西= 一箱牛奶;

}

 

方式3:方式2模拟这件事情用了两个参数,能不能少用一个参数呢。

只用一个参数既起到传入也起到传出值的作用。OK!选用ref 参数

 

 

方法构成

需要花*出*钱

方法有参数, 只有一个ref参数{传入值和传出值}

买*回*一箱牛奶

方法有返回值{不用return返回值,

而用ref参数返回值,传出值}

 

实例2还可以用以下方法来模拟:

void 逛超市(ref double 钱_买的东西)

{

       //花*出*钱

       钱_买的东西= 一箱牛奶;

}

 

四、ref ,out何时用,用在哪里

 

1、是一种可选的解决方案:

做一件事情,往往有很多方法可以选择,如果一个方法需要返回值,我们可以选择ref或out参数,如上面的例子。

如果只需要方法传出值,选out参数即可

如果需要方法既传入值也传出值,选ref参数

2、是一种最好的解决方案:

比如:某人面试了一家单位,他不但想知道是否要他,还想知道要他或不要他的原因

再如:连接数据库,想知道连接是否成功,如果连接不成功,还想知道不成功的原因

生活中实例多如牛毛:去超市买东西,交给收款员货币,你得到的不仅是要买的物品,还有找零,赠品,,,,

 

总之,当一个函数需要返回多种不同类型值的时候,往往可以使用ref ,out参数,如

bool Con_DB_Cle(string conStr,ref string why)

        {

            try

            {

                //

                why="";

                return true;

            }

            catch(Exception e)

            {

                //

                why= e.ToString();

                return false;

            }

         }

 

五、ref ,out用在哪里,让我们看看类库,类库用的不多啊!!

 

例子1:System..::.Uri.TryCreate 方法:..:: 使用指定基和相对 Uri 实例创建一个新的 Uri。

如果成功创建了 Uri,则方法返回值true;否则为 false

public static bool TryCreate(

    Uri baseUri,

    Uri relativeUri,

    out Uri result //此方法返回时,包含从 baseUri 和 relativeUri 构造的 Uri

)

public static bool TryCreate(

    string uriString,

    UriKind uriKind,

    out Uri result

)

 

例子2:

protected override bool System.Data.SqlClient.SqlDataAdapter .GetBatchedRecordsAffected

(int commandIdentifier, out int recordsAffected, out System.Exception error)

 

六、ref ,out的使用原则【依据VS.NET2008 msdn>.NET Framework 开发人员指南】

 

方+通过引用传递,也可以作为输出参数传递。

 

通过值传递参数时,方法获取调用方数据的副本,但不能改变调用方的数据副本。

通过引用传递参数时,方法获取指向调用方数据的指针。此数据与调用方共享。如果方法对引用参数做出更改,则这些更改是对调用方的数据进行的。

使用引用参数时,方法可以使用数据的初始状态。

 

输出参数与引用参数类似,不同之处在于,输出参数以独占方式用于向调用方返回数据,而引用参数可用于将数据传入方法,也可用于从方法中接收数据。

 

避免使用输出参数或引用参数。

 

使用定义输出参数或引用参数的成员需要开发人员理解指针、值类型和引用类型之间的细微差别以及输出参数和引用参数之间的初始化差异。

 

不要通过引用传递引用类型。

 

通过引用传递一个对象使方法能够用不同的实例替换该对象。在大多数情况下,方法应使用提供的对象,而不应将其替换。对于此规则,有一些少量的例外(例如,可用于交换引用的方法)。

 

部分版权所有 2005 Microsoft Corporation。保留所有权利。

部分版权所有 Addison-Wesley Corporation。保留所有权利。

有关设计指南的更多信息,请参见

Krzysztof Cwalina 和 Brad Abrams 编著、Addison-Wesley 于 2005 年出版的“Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries”

(《框架设计指南:可重用 .NET 库的约定、术语和模式》)。

 

七、ref ,out的区别?《经典面试题》

 

ref ,out的区别?

简记

1作用

ref参数既可以方法调用端方法传入值,

也可以方法方法调用端传出值

传入传出

out 参数不能由方法调用端方法传入值,

但可以方法方法调用端传出值

只传出

2语法

ref参数必须在方法调用端初始化

先初始化

out参数在方法调用端可以不初始化【也可以初始化】

但在方法体内必须初始化

后初始化


转:https://www.cnblogs.com/Eleanore/archive/2012/01/17/2324495.html



推荐阅读
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • Linux磁盘的分区、格式化的观察和操作步骤
    本文介绍了如何观察Linux磁盘的分区状态,使用lsblk命令列出系统上的所有磁盘列表,并解释了列表中各个字段的含义。同时,还介绍了使用parted命令列出磁盘的分区表类型和分区信息的方法。在进行磁盘分区操作时,根据分区表类型选择使用fdisk或gdisk命令,并提供了具体的分区步骤。通过本文,读者可以了解到Linux磁盘分区和格式化的基本知识和操作步骤。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了在使用sp_msforeachdb执行动态SQL命令时,当发生错误时如何捕获数据库名称。提供了两种解决方案,并介绍了如何正确使用'?'来显示数据库名称。 ... [详细]
author-avatar
简写青春
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有