`
java-mans
  • 浏览: 11414487 次
文章分类
社区版块
存档分类
最新评论

C#之可变参数,ref,out

 
阅读更多

1、可变参数

在C#4.0中增加了许多新的特性,这里我主要说一下——可变参数数组:int sum(params int[] values) ;int sum(string name,params int[] values)

注意:可变参数数组必须是最后一个,而且可变参数是C4.0中才有的特性。
参数默认值(C#4.0) :void SayHello(string name,int age=20)(*了解) 注意:参数默认值的设置也必须是在非默认值参数的后面。
static void Main(string[] args)
{
int[] values = { 3, 5, 2, 9, 7 };
Max(true, "", values);
int i = Max(values);

int j = Max(true, "Hello", 3, 5, 2, 97, 7);
int i = Max(3,3,5);
Console.WriteLine(j);

string[] values1 = Console.ReadLine();

Console.WriteLine("{0},{1}", 3, 5, 6, 9, 3, 3, 90, 9);
SayHello("邹玉杰");
SayHello(“YuJie", 24);
Console.ReadKey();
}

//个数不确定的可变参数以数组的形式传递
static int Max(bool b, string msg, params int[] values)
{
Console.WriteLine(msg);
int max = 0;
foreach (int value in values)
{
if (value > max)
{
max = value;
}
}
return max;
}

static void SayHello(string name,int age)
{
Console.WriteLine("我是{0},我{1}岁",name,age);
}

static void SayHello(string name)
{
SayHello(name, 20); //用重载来实现参数默认值的效果,在构造函数中用的特别多
}

函数参数默认是值传递的,也就是“复制一份”,例子:
int age=20;
IncAge(age);

Console.WriteLine("age={0}",age);


2、ref and out

ref必须先初始化,因为是引用,所以必须先“有”,才能引用,如果不先初始化,调用的时候就取不到值会报错,而out则是内部为外部赋值,所以不需要初始化,而且外部初始化也没用,但是在方法内部一定要记得为其赋值,不然返回个空的东西,有什么用?根本就没有意义了。

ref应用场景内部对外部的值进行改变,out则是内部为外部变量赋值,out一般用在函数有多个返回值的场所。

static void Main(string[] args)
{
int i1 = 1;
DotIt(i1);
Console.WriteLine(i1);
int i1 = 10;
int i2 = 20;

//Swap(i1, i2);
Console.WriteLine("i1={0},i2={1}", i1, i2); //返回的结果依旧是10,20,因为Swap(i1, i2)方法处理的是变量i1,i2的拷贝或者说是副本,变量i1,i2原先的值并没有因此而改变。

//用ref之前必须给变量赋值
Swap(ref i1, ref i2);//传递引用。给ref传递参数的时候也要加上ref
Console.WriteLine("i1={0},i2={1}", i1, i2);

bool b= false;//不需要为out赋值
int i = Parse(Console.ReadLine(), out b);
if (b)
{
Console.WriteLine("成功,i={0}", i);
}
else
{
Console.WriteLine("错误");
}
Console.ReadKey();
}

//int i传进来的的时候是复制了一份传进来,折腾的是复制品
static void DotIt(int i)
{
Console.WriteLine(i);
i++;
Console.WriteLine(i);
}

static void Swap(ref int i1, ref int i2)//reference→ref
{
//标记为ref就是要求调用者传递变量的引用
int temp = i1;
i1 = i2;
i2 = temp;
}

static void Swap(int i1, int i2)
{
int temp = i1;
i1 = i2;
i2 = temp;
}

static int Parse(string s,out bool success)
{
//Console.WriteLine(success); //这样会报错,因为success没有为其赋值
if(s=="一")
{
success = true;
return 1;
}
else if(s=="二")
{
success = true;
return 2;
}
else
{
success = false;
return -1;
}
}

关于异常处理,除非万不得已,不然尽量不要使用try catch 语句,切记!(案例:两个变量的交换;int.TryParse。)
string s = Console.ReadLine();
int i;
if (int.TryParse(s, out i))
{
Console.WriteLine("成功:" + i);
}
else
{
Console.WriteLine("输入错误");
}
//int i = Convert.ToInt32(s);
//i++;
//Console.WriteLine(i);
Console.ReadKey();

分享到:
评论

相关推荐

    在一小时内学会 C#(txt版本)

    有很多初学者的 C# 文章,这只是其中之一。 接下来关于 C# 的讨论主题: ? 编程结构 ? 命名空间 ? 数据类型 ? 变量 ? 运算符与表达式 ? 枚举 ? 语句 ? 类与结构 ? 修饰符 ? 属性 ? 接口 ? 函数参数 ? 数组 ? 索引...

    C#入门——面向对象等,代码+注释

    第6天 01方法调用 判断是否为整数 yes或no 02方法练习求数组的和 03方法 out参数求数组的和 04 out参数练习 05 out练习 06 ref参数 07 ref 参数练习 08 params 可变参数 09方法的重载 10方法的递归 11方法练习 ...

    c#学习笔记.txt

    params :params 关键字可以指定在参数数目可变处采用参数的方法参数 ref :引用传递 out : 7, namespace(名字空间) C#学习笔记(2)【大 中 小】【打印】【加入收藏】【关闭】 【收藏到新浪ViVi】【收藏到365KEY】 ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    9.4 向方法传递可变数量的参数 9.5 参数和返回类型的指导原则 9.6 常量性 第10章 属性 10.1 无参属性 10.1.1 自动实现的属性 10.1.2 合理定义属性 10.1.3 对象和集合初始化器 10.1.4 匿名类型 10.1.5 ...

    asp.net(c#)ref,out ,params的区别

    NO.1 params 一个可以让方法(函数)的拥有可变参数的关键字。 原则:在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。 示例(拷贝到vs2005中即可用,下面不再说明...

    visual C# 2010

    不同接口和委托可通过使用新的in和out语言关键字被创建。.NET Framework也可对某些现有泛型接口和委托带来不同的支持,包括IEnumerable<(Of <(T>)>)接口和Func<(Of <(TResult>)>) 与 Action<(Of <(T>)>) 委托。 新的...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    18.5 可变性和泛型接口 340 18.5.1 协变接口 341 18.5.2 逆变接口 343 第18章快速参考 345 第19章 枚举集合 347 19.1 枚举集合中的元素 347 19.1.1 手动实现枚举器 348 19.1.2 实现ienumerable接口 352 19.2...

    C#.Net基础7 基础入门知识 函数 范例 ppt

    将实参列表中跟可变参数数组类型一致的元素都当做数组的元素去处理。 params可变参数必须是形参列表中的最后一个元素。 5、方法的重载 概念:方法的重载指的就是方法的名称相同给,但是参数不同。 参数不同,分为两...

    C# for CSDN 乱七八糟的看不懂

    C#关键字 关键字 abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach ...

    CLR.via.C#.(中文第3版)(自制详细书签)

    9.4 向方法传递可变数量的参数 9.5 参数和返回类型的指导原则 9.6 常量性 第10章 属性 10.1 无参属性 10.1.1 自动实现的属性 10.1.2 合理定义属性 10.1.3 对象和集合初始化器 10.1.4 匿名类型 10.1.5 ...

    c# 加密和解密相关代码

    数据的加密与解密 文件的加密与解密 第 章 加密与解密技术 第19章 加密与解密技术 829 19.1 数据的加密与解密 实例571 异或算法对数字进行加密与解密 光盘位置:光盘\MR\19\571 ...在实现本实例之前先来...string outs...

    C# 程序设计手册(WORD)

    使用 ref 和 out 传递数组 42 隐含型别数组 44 字符串 45 字符串基本概念 46 串连多个字符串 53 修改字符串内容 56 比较字符串 60 分割字符串 65 使用字符串方法搜寻字符串 66 使用正则表达式搜寻字符串 67 判断字符...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    9.4 向方法传递可变数量的参数 9.5 参数和返回类型的指导原则 9.6 常量性 第10章 属性 10.1 无参属性 10.1.1 自动实现的属性 10.1.2 合理定义属性 10.1.3 对象和集合初始化器 10.1.4 匿名类型 10.1.5 ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    9.4 向方法传递可变数量的参数 9.5 参数和返回类型的指导原则 9.6 常量性 第10章 属性 10.1 无参属性 10.1.1 自动实现的属性 10.1.2 合理定义属性 10.1.3 对象和集合初始化器 10.1.4 匿名类型 10.1.5 ...

    【。net 专业】 面试题

    C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。 【面试题库网整理 .net 面试题(附答案)(三)】 22.您要创建一个显示公司员工列表的应用程序。您使用一个...

    亮剑.NET深入体验与实战精要2

    2.7 参数修饰符params、out和ref的区别 96 2.8 值类型和引用类型的区别 100 2.9 结构与类的区别 103 2.10 Dispose()和Close()、Finalize()的 区别 106 2.11 string和StringBuilder有什么区别 106 2.12 Debug版本和...

    亮剑.NET深入体验与实战精要3

    2.7 参数修饰符params、out和ref的区别 96 2.8 值类型和引用类型的区别 100 2.9 结构与类的区别 103 2.10 Dispose()和Close()、Finalize()的 区别 106 2.11 string和StringBuilder有什么区别 106 2.12 Debug版本和...

Global site tag (gtag.js) - Google Analytics