• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > 有关.NET参数传递的方式引发的思考

有关.NET参数传递的方式引发的思考

作者:彭泽0902 字体:[增加 减小] 来源:互联网 时间:2017-05-11

彭泽0902通过本文主要向大家介绍了java参数传递方式,函数参数的传递方式,参数传递方式,c语言参数传递方式,vb参数的默认传递方式等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

下面就简单的介绍一下.NET的一些常用参数用法,如有不足还望指正,也欢迎大家在下面留言讨论,分享自己的见解。

一.DotNet参数概述:

    .NET中参数(形式参数)变量是方法或索引器声明的一部分,而实参是调用方法或索引器时使用的表达式。

    在CLR中,默认的情况下所有的方法参数都是传值的。在传递引用类型的对象时,对一个对象的引用会传递给方法。这里的船引用本身是以传值的方式传给方法的。这也意味着方法能够修改对象,而调用者能看到这些修改。对于值类型的实例,传给方法的实例的一个副本。意味着方法将获得它专用的一个值类型实例副本,调用者中的实例不受影响。

    在CLR中允许以传引用而非传值的方式传递参数,在C#中使用out和ref来实现传递引用的方式传值。在C#中使用out和ref来实现传递引用的方式传值,这两个关键字告诉编译器生成元数据来指明该参数是传引用的,编译器将生成代码来传递参数的地址,而不是传递参数本身。为值类型使用out和ref,效果等同于以传值的方式传递引用类型。  

    常用的参数主要有基本类型参数,泛型参数,以及<in T>和<out T>,dynamic等等。例如<in T>和<out T>,在CLR中支持泛型类型的可变性,C#在4.0时获得了生命泛型遍体所必须的语法,并且现在编译器也能够知道接口和委托可能的转换。可变性是以一种类型安全的方式,讲一个对象作为另一个对象来使用。可变性应用于泛型接口和泛型委托的类型参数中。协变形用于向调用者返回某项操作的值;逆变性是指调用者想API传入值;不变性是相对于协变性和逆变性,是指什么也不会发生。对于这方面的知识非常的丰富,有兴趣的可以自行了解,这里就不做详细的介绍了。dynamic类型,C#是一门静态类型的语言,在某些情况下,C#编译器要寻找特定的名称而不是接口。dynamic可以在编译时做任何事,到执行时再由框架进行处理。有关动态类型的介绍也不做更深入的介绍。

    在.NET中参数的使用方法主要为可选参数、命名参数、可变数量参数等等。本文下面也是主要介绍这三种参数的使用方法。

二.DotNet参数用法:

    以下是主要介绍三种参数的用法:可选参数;命名实参;传递可变数量的参数。  

   1.可选参数:

     (1).基本用法:

        如果某个操作需要多个值,而有些值在每次调用的时候又往往是相同的,这时通常可以使用可选参数。在C#以前实现可变参数的功能,往往声明一个包含所有可能参数的方法,其他方法调用这个方法,并传递恰当的默认值。

        在可选参数中,设计一个方法的参数时,可以为部分或全部参数分配默认值。在调用这些方法代码可以选择不指定部分实参,接受默认值。还可以在调用方法时,还可以通过指定参数名称的方式为其传递实参。如下实例:

 static void OptionalParameters(int x, int y = 10, int z = 20)
  {
   Console.WriteLine("x={0} y={1} z={2}",x,y,z);
  }
    </div>
 OptionalParameters(1, 2, 3);
   OptionalParameters(1, 2);
   OptionalParameters(1);
</div>

     以上的例子可以很清楚的看到其用法,int y=10和int z=20这两个参数就是可选参数。可选参数的使用中,如果调用时省略了一个参数,C#编译器会自动嵌入参数的默认值。向方法传递实参时,编译器按从左向右的顺序对实参进行求值。使用已命名的参数传递实参时,编译器仍然按照从左到右的顺序对实参进行求值。

      (2).基本原则:

       可选参数包含一些规范,具体的一些要求如下:

    (a).所有可选参数必须出现在必备参数之后,参数数组(使用params修饰符声明)除外,但他们必须出现在参数列表的最后,在他们之前是可选参数。

    (b).参数数组不能声明为可选的,如果调用者没有指定值,将使用空数组代替。

    (c).可选参数不能使用ref和out修饰符。

    (d).可选参数可以为任何类型,但对于指定的默认值却有一些限制,那就是默认值必须为常量(数字或字符串字面量、null、const成员、枚举成员、default(T)操作符)。

    (e).指定的值会隐式转换为参数类型,但是这种转换不能是用户定义的。

    (f).可以为方法、构造器、有参属性的参数指定默认值,还可以为属于委托定一部分的参数指定默认值。

    (g).C#不允许省略逗号之间的实参。

      在使用可选参数时,对于引用类型使用null来做默认值,如果参数类型是值类型,只需要使用相应的可空值类型作为默认值。

      (3).代码示例:  

 /// <summary>
  /// 提取异常及其内部异常堆栈跟踪
  /// </summary>
  /// <param name="exception">提取的例外</param>
  /// <param name="lastStackTrace">最后提取的堆栈跟踪(对于递归), String.Empty or null</param>
  /// <param name="exCount">提取的堆栈数(对于递归)</param>
  /// <returns>Syste.String</returns>
  public static string ExtractAllStackTrace(this Exception exception, string lastStackTrace = null, int exCount = 1)
  {
   while (true)
   {
    var ex = exception;
    const string entryFormat = "#{0}: {1}\r\n{2}";
    lastStackTrace = lastStackTrace ?? string.Empty;
    lastStackTrace += string.Format(entryFormat, exCount, ex.Message, ex.StackTrace);
    if (exception.Data.Count > 0)
    {
     lastStackTrace += "\r\n Data: ";
     lastStackTrace = exception.Data.Cast<DictionaryEntry>().Aggregate(lastStackTrace, (current, entry) => current + $"\r\n\t{entry.Key}: {exception.Data[entry.Key]}");
    }
    //递归添加内部异常
    if ((ex = ex.InnerException) == null) return lastStackTrace;
    exception = ex;
    lastStackTrace = $"{lastStackTrace}\r\n\r\n";
    exCount = ++exCount;
   }
  }
</div>

   2.命名实参:

         以上讲解了可选参数的一些基本概念和用法,接下来看一下命名参数的相关操作用法:

      (1).基本用法:

          命名实参是指在指定实参的值时,可以同时指定相应的参数名称。编译器将判断参数的名称是否正确,并将指定的值赋给这个参数。命名参数在各个实参之前加上它们的参数名称以及一个冒号。如下代码:

new StreamWriter(path:filename,aooend:true,encoding:realEncoding);
</div>

如果要对包含ref和out的参数指定名称,需要将ref和out修饰符放在名称之后,实参之前。

int number;
bool success=int.TryParse("10",result:out number);
</div>

      (2).基本原则:

        在命名参数中,所有的命名参数必须位于位置实参之后,两者之间的位置不能改变。位置实参总是指向方法声明中相应的参数,不能跳过参数之后,在通过命名相应位置的实参来指定。实参仍然按编写顺序求值,即使这个顺序有可能会不同于参数的声明顺序。

        在一般情况下,可选参数与命名实参会一起配合使用。可选参数会增加适用方法的数量,而命名实参会减少使用方法的数量。为了检查是否存在特定的适用方法,编译器会使用位置参数的顺序构建一个传入实参的列表,然后对命名实参和剩余的参数进行匹配。如果没有指定某个必备参数,或某个命名实参不能与剩余的参数相匹配,那么这个方法就不是适用的。

       命名实参有时可以代替强制转换,来辅助编译器进行重载决策。如果方法是从模块的外部调用的,更改参数的默认值是具有潜在的危险的。可以按名称将实参传给没有默认值的参数,但是编译器要想编译代码,所有要求的实参都必须传递。

       在写C#代码与COM对象模型进行互操作时,C#的可选参数和命名参数功能是最好用的,调用一个COM组件时,为了以传引用的方式传递一个实参,C#还允许省略REF/OUT,在嗲用COM组件时,C#要求必须向实参应用OUT.REF关键字。   

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 有关.NET参数传递的方式引发的思考

相关文章

  • 2017-05-11asp.net服务器上几种常见异常的解决方案.
  • 2017-05-11ASP.NET MVC5 网站开发框架模型、数据存储、业务逻辑(三)
  • 2017-05-11asp.net线程批量导入数据时通过ajax获取执行状态
  • 2017-05-11asp.net下生成英文字符数字验证码的代码
  • 2017-05-11ASP.NET中HTML页面的访问验证设置方法
  • 2017-05-11在ASP.NET中重写URL的代码
  • 2017-05-11解决WPF中空域问题(Airspace issuse)
  • 2018-08-20如何利用HttpClientFactory实现简单的熔断降级
  • 2017-05-11ASP.NET webUploader上传大视频文件相关web.config配置
  • 2017-05-11介绍几个ASP.NET中容易忽略但却很重要的方法函数

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • asp.net下模态对话框关闭之后继续执行服务器端代码的问题
    • ASP.NET中数据库操作初步
    • ASP.NET生成图形验证码的方法详解
    • ASP.NET MVC 导出Word报表
    • Repeater中嵌套Repeater的示例介绍
    • Asp.net使用SignalR实现发送图片
    • Log4net日志记录组件的使用步骤详解和下载
    • Asp.net获取服务器指定文件夹目录文件并提供下载的方法
    • 数据绑定之DataFormatString使用介绍
    • .net自带的库生成zip文件的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有