`
lovnet
  • 浏览: 6971291 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

.net程序员的盲点(一):参数修饰符ref,out ,params的区别

阅读更多

C#中有三个关键字-ref,out ,params,虽然本人不喜欢这三个关键字,因为它们疑似破坏面向对象特性。但是既然m$把融入在c#体系中,那么我们就来认识一下参数修饰符ref,out ,params吧,还有它们的区别。
NO.1params
一个可以让方法(函数)的拥有可变参数的关键字。

原则:在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。

示例(拷贝到vs2005中即可用,下面不再说明)
publicpartialclassForm1:Form
...{
publicstaticvoidUseParams(paramsint[]list)
...{
stringtemp="";
for(inti=0;i<list.Length;i++)
temp
=temp+""+list[i].ToString();
MessageBox.Show(temp);
}


publicstaticvoidUseParams2(paramsobject[]list)
...{
stringtemp="";
for(inti=0;i<list.Length;i++)
temp
=temp+""+list[i].ToString();
MessageBox.Show(temp);
}


publicForm1()
...{
InitializeComponent();
}


privatevoidbutton1_Click(objectsender,EventArgse)
...{
UseParams(
1,2,3);//看参数是3个
UseParams(1,2);//看参数是2个,可变吧


UseParams2(
1,'a',"test");

int[]myarray=newint[3]...{10,11,12};
UseParams(myarray);
//看也可以是容器类,可变吧:)
}

}
NO.2 out
这是一个引用传递L
原则一:当一个方法(函数)在使用out作为参数时,在方法中(函数)对out参数所做的任何更改都将反映在该变量中。
原则二:当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
原则三:若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。
原则四:不必初始化作为 out 参数传递的变量,因为out 参数在进入方法(函数)时后清空自己,使自己变成一个干净的参数,也因为这个原因必须在方法返回之前为 out 参数赋值(只有地址没有值的参数是不能被.net接受的)。
原则五:属性不是变量,不能作为 out 参数传递。
原则六:如果两个方法的声明仅在 out 的使用方面不同,则会发生重载。不过,无法定义仅在 ref out 方面不同的重载。例如,以下重载声明是有效的:
class MyClass
{
public void MyMethod(int i) {i = 10;}
public void MyMethod(out int i) {i = 10;}
}
而以下重载声明是无效的:
class MyClass
{
public void MyMethod(out int i) {i = 10;}
public void MyMethod(ref int i) {i = 10;}
}
有关传递数组的信息,请参见使用 ref out 传递数组。
示例附后


NO.2 ref
ref
仅仅是一个地址!!!
原则一:当一个方法(函数)在使用ref作为参数时,在方法中(函数)对ref参数所做的任何更改都将反映在该变量中。
原则二:调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
原则三:若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值可以被传递到 ref 参数。
原则四:ref参数传递的变量必须初始化,因为ref参数在进入方法(函数)时后还是它自己,它这个地址指向的还是原来的值,也因为这个原因ref参数也可以在使用它的方法内部不操作。
原则六:如果两种方法的声明仅在它们对 ref 的使用方面不同,则将出现重载。但是,无法定义仅在 ref out 方面不同的重载。例如,以下重载声明是有效的:
class MyClass
{
public void MyMethod(int i) {i = 10;}
public void MyMethod(ref int i) {i = 10;}
}
但以下重载声明是无效的:
class MyClass
{
public void MyMethod(out int i) {i = 10;}
public void MyMethod(ref int i) {i = 10;}
}
有关传递数组的信息,请参见使用 ref out 传递数组。
示例

publicstaticstringTestOut(outstringi)
...{
i
="outb";
return"returnvalue";
}



publicstaticvoidTestRef(refstringi)
...{
//改变参数
i="refb";
}


publicstaticvoidTestNoRef(stringrefi)
...{
//不用改变任何东西,这个太明显了
refi="onc";
}


publicForm1()
...{
InitializeComponent();
}


privatevoidbutton1_Click(objectsender,EventArgse)
...{
stringouti;//不需要初始化
MessageBox.Show(TestOut(outouti));//返回值
//输出"returnvalue";
MessageBox.Show(outi);//调用后的out参数
//输出"outb";


stringrefi="a";//必须初始化
TestRef(refrefi);//调用参数
MessageBox.Show(refi);
//输出"refb";
TestNoRef(refi);//不使用ref
MessageBox.Show(refi);
//输出"refb";
}


分享到:
评论

相关推荐

    C#与.NET程序员面试宝典

    《C#与.NET程序员面试宝典》取材于各大IT公司的历年面试题252个(包括研发类笔试及口试题目、情商及智商类题目),详细分析了应聘C#与.NET程序员职位的常见考点。《C#与.NET程序员面试宝典》主要内容包括:面试流程...

    认证培训之一:微软.NET程序员高级培训教程系列资料

    认证培训之一:微软.NET程序员高级培训教程系列资料 本资源主要面向微软.NET程序员,旨在提供高级培训教程系列资料,涵盖从软件构架的基础知识到企业级应用程序的构架、.NET软件构架的基础知识、Teamwork与Bug ...

    .NET程序员面试指南2

    .NET程序员面试指南2 .NET程序员面试指南2 .NET程序员面试指南2

    .NET程序员简历模板

    在.NET程序员的求职过程中,一份精心制作的简历是至关重要的。以下是对.NET程序员简历模板的详细解析,旨在帮助你理解如何有效地展示你的技能和经验。 首先,标题".NET程序员简历模板"表明这是一个针对.NET开发人员...

    FastReport.NET 程序员手册2023(中文版)

    《FastReport.NET 程序员手册2023(中文版)》是针对.NET开发者设计的一款详尽的报表开发指南。FastReport是一款强大的报表解决方案,它为.NET Framework和.NET Core提供了全面的报告生成和设计功能。这款工具以其...

    .net程序员面试指南

    《.NET程序员面试指南》是一本专为准备.NET程序员面试者设计的实用参考资料,旨在帮助求职者更好地理解和应对面试中的各种技术问题。该指南涵盖了.NET框架的基础知识、C#编程语言、ASP.NET web开发、数据库交互、...

    .NET程序员面试指南1.pdf

    这是.NET程序员面试指南1 .NET程序员面试指南2=http://download.csdn.net/source/1597090

    .net程序员面试题

    1. 访问修饰符:在.NET中,访问修饰符控制类的成员对外部代码的可见性。`private`表示只在类内部访问,`protected`允许在类内部及其子类中访问,`public`允许任何地方访问,`internal`则限于同一命名空间内的访问。 ...

    .NET程序员面试专题

    .NET程序员面试专题(面试题集)Tiger .net 面试题目及解答

    .net 面试题(.net程序员面试必看)

    - ASP.NET:用于构建Web应用程序,包含MVC、Web Forms、Web API等多种模式。 3. **ASP.NET面试重点**: - MVC(Model-View-Controller):理解模型、视图和控制器的职责,以及路由配置。 - Razor视图引擎:学习...

    ASP.NET程序员面试题及答案

    通过上述对题目中提及的知识点的详细解析,我们可以看出,掌握C#的基础语法和高级特性、理解.NET Framework的核心概念、熟悉常见的设计模式和技术,对于成为一名合格的ASP.NET程序员至关重要。在准备相关面试时,...

    ASP.NET 程序员助手

    作为一款“ASP.NET 程序员助手”,它很可能是为ASP.NET开发者提供的一系列工具、库或插件的集合,旨在提高开发效率,简化常见任务,例如代码生成、调试辅助、性能分析、自动化测试等方面。这个“程序员助手 2.0”...

    .net程序员面试宝典.pdf

    2011年.net程序员面试宝典.pdf

    asp.net程序员查询辞典

    ASP.NET程序员查询辞典是一个为.NET开发者,特别是专注于ASP.NET技术的程序员精心设计的学习资源。这个工具集合了大量关于ASP.NET编程的知识点,旨在帮助开发者更高效、更深入地理解和运用这项技术。以下是一些核心...

    微软.NET程序员高级培训教程系列资料

    微软.NET程序员高级培训教程系列资料微软.NET程序员高级培训教程系列资料微软.NET程序员高级培训教程系列资料微软.NET程序员高级培训教程系列资料微软.NET程序员高级培训教程系列资料微软.NET程序员高级培训教程系列...

    .net程序员总结一些编程的技术

    在.NET编程领域,掌握一系列关键技术和实践是每个程序员必须面对的挑战。以下是对标题和描述中涉及的一些核心知识点的详细阐述: 1. **ASP.NET**:ASP.NET是Microsoft推出的一个用于构建Web应用程序的框架,它提供...

    .net程序员成长中书籍的推荐

    ### .NET程序员成长之路:精选30本书籍推荐 在IT行业中,持续学习与技能提升是保持竞争力的关键。本文将围绕HTML(Web的基础)、JavaScript(让网页动起来)、C#(程序开发)以及数据库管理这四个方向,推荐一系列...

    [认证培训之一:微软.NET程序员高级培训教程系列资料].vb.net

    标题"认证培训之一:微软.NET程序员高级培训教程系列资料].vb.net"表明这是一份针对微软.NET框架下VB.NET编程语言的高级培训教程。这可能是一个完整的学习资源包,旨在帮助程序员提升在.NET平台上的开发技能,以获取...

Global site tag (gtag.js) - Google Analytics