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#】参数的更多相关文章

  1. clr via c# 参数和属性

    1,可选参数和命名参数 当给参数指定默认值时,可以在调用的时候省略 有默认值的参数,必须放在所有没有默认值的参数后面,但是 参数数组必须放在最后面,parm 默认值必须时编译时能确定的常量值,对于值类 ...

  2. 带参数的CLR存储过程

    昨天有学习<简单创建与布署CLR存储过程>http://www.cnblogs.com/insus/p/4371762.html,知道怎样创建以及布署至SQL中去. 下面这个范例是实现CL ...

  3. [译]C# 7系列,Part 8: in Parameters in参数

    原文:https://blogs.msdn.microsoft.com/mazhou/2018/01/08/c-7-series-part-8-in-parameters/ 背景 默认情况下,方法参数 ...

  4. 编写轻量ajax组件01-对比webform平台上的各种实现方式

    前言 Asp.net WebForm 和 Asp.net MVC(简称MVC) 都是基于Asp.net的web开发框架,两者有很大的区别,其中一个就是MVC更加注重http本质,而WebForm试图屏 ...

  5. Edge.js:让.NET和Node.js代码比翼齐飞

    通过Edge.js项目,你可以在一个进程中同时运行Node.js和.NET代码.在本文中,我将会论述这个项目背后的动机,并描述Edge.js提供的基本机制.随后将探讨一些Edge.js应用场景,它在这 ...

  6. [翻译] WCF运行时架构

    原文地址 http://www.cnblogs.com/idior/articles/971252.html 介绍 WCF具有非常易用的编程模型,服务开发者在掌握ABC的概念后可以很容易的使用WCF去 ...

  7. Main()方法

    C#是从方法Main()开始执行的.这个方法必须是类或结构的静态方法,并且其返回类型必须是int或void .虽然显式指定p山屺修饰符是很常见的,因为按照定义,必须在程序外部调用该方法,但我们给该入口 ...

  8. C#中参数传递【转】

    转自[Learning hard] 建议参考 『第十一回:参数之惑---传递的艺术(上)』 一.引言 对于一些初学者(包括工作几年的人在内)来说,有时候对于方法之间的参数传递的问题感觉比较困惑的,因为 ...

  9. C#学习笔记——面向对象、面向组件以及类型基础

    C#学习笔记——面向对象.面向组件以及类型基础 目录 一 面向对象与面向组件 二 基元类型与 new 操作 三 值类型与引用类型 四 类型转换 五 相等性与同一性 六 对象哈希码 一 面向对象与面向组 ...

  10. C# API 大全

    C:\ProgramFiles\MicrosoftVisual Studio .NET\ FrameworkSDK\Samples\ Technologies\ Interop\PlatformInv ...

随机推荐

  1. 【Git】标签管理

    来源:廖雪峰 为什么要标签: 发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来. ...

  2. 在HTML网页中设置弹出窗口的办法

    [1.最基本的弹出窗口代码] 其实代码非常简单: <SCRIPT LANGUAGE="javascript"> <!-- window.open ('page.h ...

  3. 142. Linked List Cycle II

    题目: Given a linked list, return the node where the cycle begins. If there is no cycle, return null. ...

  4. August 27th 2016 Week 35th Saturday

    Life is a series of commas, not periods. 人生是一系列的逗号,而不是句号. Sometimes I would rather life to be like a ...

  5. c语言中的浮点数

    一.浮点数常量(小数) 0.11L, 0.0f ,0.0,1.88,2.5f ,0.188E1 E3表示103        比如 1.88E 3=1.88*1000=1880.0f E-3表示10- ...

  6. openfile学习笔记

    Openfiler是在rPath Linux基础上开发的,它能够作为一个独立的Linux操作系统发行.Openfiler是一款非常好的存储管理操作系统,开源免费,通过web界面对 存储磁盘的管理,支持 ...

  7. Eclipse的使用及Java程序的标识符和关键字

    Eclipse的使用 (1)创建Java项目 选择“文件”/“新建”/“Java项目”命令,在弹出的“新建Java项目”对话框输入项目名,然后点击“下一步”,最后单击“完成”. (2)创建Java类文 ...

  8. jQuery - 9.Ajax

    9.1 Ajax 的 XMLHttpRequest 对象 9.2 JQuery中的Ajax 9.2.1 load()方法 9.2.2 $.get() 9.2.3 $.post() 9.2.4 $.ge ...

  9. Unity依赖注入使用

    构造器注入(Constructor Injection):IoC容器会智能地选择选择和调用适合的构造函数以创建依赖的对象.如果被选择的构造函数具有相应的参数,IoC容器在调用构造函数之前会自定义创建相 ...

  10. C#接扣和抽象类

    什么是接口? 接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称.参数和返回值.接口方法不能包含任何实现,CLR允许接口可以包含事件.属性.索引器.静态方法.静态字段.静态构造函数以及常数.但是 ...