【CLR in c#】参数
1.可选参数和命名参数
设计一个参数时,可为部分或全部参数分配默认值,调用这些方法的代码可以选择不指定部分实参,接受默认值,还可以通过制定参数名称的方式传递实参。如下
class CLR可选参数
{
private static int s_n = ;
private static void M(int x = , string s = "A", DateTime dt = default(DateTime), Guid guid = new Guid())
{
Console.WriteLine("x={0},s={1},dt={2},guid={3}", x, s, dt, guid);
}
public static void Test()
{
//等同于M(9, "A", default(DateTime), new Guid())
M();
//等同于M(8, "X", default(DateTime), new Guid())
M(, "X");
//等同于M(5, "A", DateTime.Now, Guid.NewGuid()))
M(, guid: Guid.NewGuid(), dt: DateTime.Now); //等同于string t1=0,t2=1;
//M(t2,t1,default(DateTime), new Guid())
M(s: (s_n++).ToString(), x: s_n++); }
}
结果:
x=9,s=A,dt=0001/1/1 0:00:00,guid=00000000-0000-0000-0000-000000000000
x=8,s=X,dt=0001/1/1 0:00:00,guid=00000000-0000-0000-0000-000000000000
x=5,s=A,dt=2014/10/20 1:23:02,guid=ae35fafd-dc14-43d9-be4c-97e7e33d0cf6
x=1,s=0,dt=0001/1/1 0:00:00,guid=00000000-0000-0000-0000-000000000000
2.隐式类型的局部变量
也就是使用var,编译器会根据表达式推断具体的数据类型。只是举报变量的一种简化语法,只能用于声明方法内部的局部变量。没有太多需要说的,
3.以传引用的方式向方法传递参数(ref和out关键字)
CLR用关键字ref和out来传引用而非传值的方式传递参数,告诉编译器生成的代码来传递参数的地址而不是传递参数本身。
在CLR的角度,ref和out是完全一样的,区别在于out不需要再调用前初始化对象,而且在返回前必须写入值,而ref关键字则必须在调用方法前初始化参数的值。
public sealed class Program{
public static void Main(){
int x; //x没有初始化
GetVal(out x); //x不必初始化
Console.WriteLine(x); //显示10
}
private static void GetVal(out int v){
v=; //该方法必须初始化v
}
} public sealed class Program{
public static void Main(){
int x=; //已经初始化
GetVal(ref x); //x不必初始化
Console.WriteLine(x); //显示15
}
private static void GetVal(ref int v){
v+=; //该方法可使用v的已初始化的值
}
}
4.向方法传递可变数量的参数(params)
static int Add(params int[] values)
{
int sum=;
if(values!=null)
{
for(int x=;x<values.Length;x++)
sum+=values[x];
}
} //调用方法1
Add(new int[]{,,,,,});
//调用方法2,简化方法
Add(,,,,,);
只有方法的最后一个参数才可以使用params关键字来标记,但使用该关键字会造成一些额外的性能损失,因为数组对象必须分配在堆上,必须初始化,最终被垃圾回收。可以考虑定义几个没有使用params关键字的重载版本。
5,定义参数和返回类型的指导原则
1.尽量指定最弱的类型,最好是接口而不是基类
//好:使用一个弱参数类型
public void ManipulateItems<T>(IEnumerable<T> collection){}
//不好:使用一个强参数类型
public void ManipulateItems<T>(List<T> collection){}
调用第一个方法时候可传递数组对象、List<T>对象,string对象等其他实现了IEnumerable接口的对象。而第二个方法只允许传递List<T>对象,显然第一个更加灵活。
2,好的返回类型一般声明为最强类型,以免受限于特定类型。
//好,返回强返回类型
public FileStream OpenFile(){}
//不好,返回弱返回类型
public Stream OpenFile(){}
因为第一个方法即可与返回FileStream ,也可以返回Stream
【CLR in c#】参数的更多相关文章
- clr via c# 参数和属性
1,可选参数和命名参数 当给参数指定默认值时,可以在调用的时候省略 有默认值的参数,必须放在所有没有默认值的参数后面,但是 参数数组必须放在最后面,parm 默认值必须时编译时能确定的常量值,对于值类 ...
- 带参数的CLR存储过程
昨天有学习<简单创建与布署CLR存储过程>http://www.cnblogs.com/insus/p/4371762.html,知道怎样创建以及布署至SQL中去. 下面这个范例是实现CL ...
- [译]C# 7系列,Part 8: in Parameters in参数
原文:https://blogs.msdn.microsoft.com/mazhou/2018/01/08/c-7-series-part-8-in-parameters/ 背景 默认情况下,方法参数 ...
- 编写轻量ajax组件01-对比webform平台上的各种实现方式
前言 Asp.net WebForm 和 Asp.net MVC(简称MVC) 都是基于Asp.net的web开发框架,两者有很大的区别,其中一个就是MVC更加注重http本质,而WebForm试图屏 ...
- Edge.js:让.NET和Node.js代码比翼齐飞
通过Edge.js项目,你可以在一个进程中同时运行Node.js和.NET代码.在本文中,我将会论述这个项目背后的动机,并描述Edge.js提供的基本机制.随后将探讨一些Edge.js应用场景,它在这 ...
- [翻译] WCF运行时架构
原文地址 http://www.cnblogs.com/idior/articles/971252.html 介绍 WCF具有非常易用的编程模型,服务开发者在掌握ABC的概念后可以很容易的使用WCF去 ...
- Main()方法
C#是从方法Main()开始执行的.这个方法必须是类或结构的静态方法,并且其返回类型必须是int或void .虽然显式指定p山屺修饰符是很常见的,因为按照定义,必须在程序外部调用该方法,但我们给该入口 ...
- C#中参数传递【转】
转自[Learning hard] 建议参考 『第十一回:参数之惑---传递的艺术(上)』 一.引言 对于一些初学者(包括工作几年的人在内)来说,有时候对于方法之间的参数传递的问题感觉比较困惑的,因为 ...
- C#学习笔记——面向对象、面向组件以及类型基础
C#学习笔记——面向对象.面向组件以及类型基础 目录 一 面向对象与面向组件 二 基元类型与 new 操作 三 值类型与引用类型 四 类型转换 五 相等性与同一性 六 对象哈希码 一 面向对象与面向组 ...
- C# API 大全
C:\ProgramFiles\MicrosoftVisual Studio .NET\ FrameworkSDK\Samples\ Technologies\ Interop\PlatformInv ...
随机推荐
- [Linux] vim的高亮查找操作
reference : http://blog.chinaunix.net/uid-20732478-id-763411.html 使用了VIM这么久,却一直无法牢记一些基本的操作指令.今天查找一个 ...
- IE11 的区别
http://msdn.microsoft.com/zh-tw/visualc/bg182625
- No space left on device 解决Linux系统磁盘空间满的办法
最近Linux电脑在执行mvn时候总是报错: No space left on device 原因是磁盘空间满了,我马上加了20G的硬盘容量,但是还是报错,上网查了一下,发现了解决方法,我用了其中 ...
- LNMP平台搭建---Linux系统安装篇
在互联网网站开发领域,有一个名词,大家一定不陌生,那就是LAMP,经典的Web服务器环境,由Linux+Apache+MySQL+PHP组成,,后来,一个名叫Nginx的Web服务器开源出来了,因其更 ...
- Linux(CentOS)系统下设置nginx开机自启动
Nginx 是一个很强大的高性能Web和反向代理服务器.下面介绍在linux下安装后,如何设置开机自启动.首先,在linux系统的/etc/init.d/目录下创建nginx文件,使用如下命令:vi ...
- Javascript和Java获取各种form表单信息的简单实例
大家都知道我们在提交form的时候用了多种input表单.可是不是每一种input表单都是很简单的用Document.getElementById的方式就可以获取到的.有一些组合的form类似于che ...
- APP消息推送:通知和透传
目前市场上的消息推送方式有两种:通知和透传.什么是透传?透传即是透明传送,即传送网络无论传输业务如何,只负责将需要传送的业务传送到目的节点,同时保证传输的质量即可,而不对传输的业务进行处理.透传消息, ...
- C# virtual override 和 new 的区别
一直以来我都对 virtual override 和 new 之间的区别感到疑惑不解. 特别笔试的时候特别容易考到,真的很容易弄错啊,畜生! 光看理论永远记不住,那不如写几行代码就懂了. 首先看看v ...
- 【翻译十五】-java并发之固定对象与实例
Immutable Objects An object is considered immutable if its state cannot change after it is construct ...
- Web框架之Tornado
概述 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...