[你必须知道的.NET]第十一回:参数之惑---传递的艺术(上)

本文将介绍以下内容:

按值传递与按引用传递深论

ref和out比较

参数应用浅析

1.引言

接上回《第九回:品味类型---值类型与引用类型(中)-规则无边》中,对值类型和引用类型的讨论,其中关于string类型的参数传递示例和解释,引起园友的关注和讨论,可谓一石激起千层浪。受教于装配脑袋的深切指正,对这一概念有了相当进一步的了解,事实证明是我错了,在此向朋友们致歉,同时非常感谢大家的参与,尤其是装配脑袋的不倦相告。

因此,本文就以更为清晰的角度,把我理解有误的雷区作做以深入的讨论与分析,希望通过我的一点点努力和探讨至少对如下几个问题能有清晰的概念:

什么是按值传递?什么是按引用传递?

按引用传递和按引用类型参数传递的区别?

ref与out在按引用传递中的比较与应用如何?

param修饰符在参数传递中的作用是什么?

2.参数基础论

简单的来说,参数实现了不同方法间的数据传递,也就是信息交换。Thinking in Java的作者有过一句名言:一切皆为对象。在.NET语言中也是如此,一切数据都最终抽象于类中封装,因此参数一般用于方法间的数据传递。例如典型的Main入口函数就有一个string数组参数,args是函数命令行参数。通常参数按照调用方式可以分为:形参和实参。形参就是被调用方法的参数,而实参就是调用方法的参数。例如: 

using System;

public class Arguments
{
   public static void Main(string [] args)
   {
     string myString = "This is your argument.";
     //myString是实际参数
     ShowString(myString);
   }

   private void ShowString(string astr)
   {
     Console.WriteLine(astr);
   }
}

由上例可以得出以下几个关于参数的基本语法:

形参和实参必须类型、个数与顺序对应匹配;

参数可以为空;

解析Main(string [] args),Main函数的参数可以为空,也可以为string数组类,其作用是接受命令行参数,例如在命令行下运行程序时,args提供了输入命令行参数的入口。

时间: 2025-01-21 23:59:12

[你必须知道的.NET]第十一回:参数之惑---传递的艺术(上)的相关文章

[你必须知道的.NET]第二十一回:认识全面的null

1 从什么是null开始? null,一个值得尊敬的数据标识. 一般说来,null表示空类型,也就是表示什么都没有,但是"什么都没有"并不意味"什么都不是".实际上,null是如此的重要,以致于在JavaScript中,Null类型就作为5种基本的原始类型之一,与Undefined.Boolean.Number和String并驾齐驱.这种重要性同样表现在.NET中,但是一定要澄清的是,null并不等同于0,"",string.Empty这些通常意

[你必须知道的.NET] 第五回:深入浅出关键字---把new说透

相关文章: [你必须知道的.NET] 第三回:历史纠葛:特性和属性 [你必须知道的.NET] 第四回:后来居上:class和struct 本文将介绍以下内容: 面向对象基本概念 new关键字深入浅出 对象创建的内存管理 1.引言 园子里好像没有或者很少把new关键字拿出来说的,那我就占个先机吧,呵呵.那么,我们到底有必要将一个关键字拿出来长篇大论吗?看来是个问题.回答的关键是:你真的理解了new吗?如果是,那请不要浪费时间,如果不是,那请继续本文的循序之旅. 下面几个 问题可以大概的考察你对ne

[你必须知道的.NET]第十二回:参数之惑---传递的艺术(下)

本文将介绍以下内容: 按值传递与按引用传递深论 ref和out比较 参数应用浅析 接上篇继续,『第十一回:参数之惑---传递的艺术(上)』 4.2 引用类型参数的按值传递 当传递的参数为引用类型时,传递和操作的是指向对象的引用,这意味着方法操作可以改变原来的对象,但是值得思考的是该引用或者说指针本身还是按值传递的.因此,我们在此必须清楚的了解以下两个最根本的问题: 引用类型参数的按值传递和按引用传递的区别? string类型作为特殊的引用类型,在按值传递时表现的特殊性又如何解释? 首先,我们从基

[你必须知道的.NET]第二十回:学习方法论

说在,开篇之前 本文,源自我回答刚毕业朋友关于.NET学习疑惑的回复邮件. 本文,其实早计划在<你必须知道的.NET>写作之初的后记部分,但是因为个中原因未能如愿,算是补上本书的遗憾之一. 本文,作为[<你必须知道的.NET>]系列的第20回,预示着这个系列将开始新的征程,算是[你必须知道的.NET]2.0的开始. 本文,作为一个非技术篇章,加塞儿到<你必须知道的.NET>队伍中,我想至少因为回答了以下几个必须知道的非技术问题:.NET应该学习什么? .NET应该如何学

[你必须知道的.NET]第二十七回:interface到底继承于object吗?

说在,开篇之前 在.NET世界里,我们常常听到的一句话莫过于"System.Object是一切类型的根,是所有类型的父类",以至于我在<你必须知道的.NET>8.1节 以"万物归宗:System.Object"这样的title为System.Object授予至高荣誉.所以,基于这样的观点就有了下面这句"接口是否也继承于System.Object?",事实上这正是今天在技术群里小小讨论的一个插曲. 1 缘起 在.NET世界里,我们常常听

[你必须知道的.NET]第十回:品味类型---值类型与引用类型(下)-应用征途

本文将介绍以下内容: 类型的基本概念 值类型深入 引用类型深入 值类型与引用类型的比较及应用 1.引言 值类型与引用类型的话题经过了两个回合([第八回:品味类型---值类型与引用类型(上)-内存有理]和[第九回:品味类型---值类型与引用类型(中)-规则无边])的讨论和切磋,我们就基本的理解层面来说已经差不多了,但是对这一部分的进一步把握和更深刻的理解还要继续和深化,因为我自己就在两篇发布之际,我就得到装配脑袋兄的不倦指导,之后又查阅了很多的资料发现类型在.NET或者说语言基础中何其重要的内涵和

[你必须知道的.NET] 第八回:品味类型---值类型与引用类型(上)-内存有理

本文将介绍以下内容: 类型的基本概念 值类型深入 引用类型深入 值类型与引用类型的比较及应用 1.引言 买了新本本,忙了好几天系统,终于开始了对值类型和引用类型做个全面的讲述了,本系列开篇之时就是因为想写这个主题,才有了写个系列的想法.所以对值类型和引用类型的分析,是我最想成文的一篇,其原因是过去的学习过程中我就是从这个主题开始,喜欢以IL语言来分析执行,也喜好从底层的过程来深入了解.这对我来说,似乎是一件找到了有效提高的方法,所以想写的冲动就没有停过,旨在以有效的方式来分享所得.同时,我也认为

[你必须知道的.NET] 第三回:历史纠葛:特性和属性

1. 引言 attribute是.NET框架引入的有一技术亮点,因此我们有必要花点时间走进一个发现attribute登堂入室的入口.因为.NET Framework中使用了大量的定制特性来完成代码约定,[Serializable].[Flags].[DllImport].[AttributeUsage]这些的构造,相信我们都见过吧,那么你是否了解其背后的技术. 提起特性,由于高级语言发展的历史原因,不免让人想起另一个耳熟能详的名字:属性.特性和属性,往往给初学者或者从C++转移到C#的人混淆的概

[你必须知道的.NET] 第四回:后来居上:class和struct

1. 引言 提起class和struct,我们首先的感觉是语法几乎相同,待遇却翻天复地.历史将接力棒由面向过程编程传到面向对象编程,class和struct也背负着各自的命运前行.在我认为,struct英雄迟暮,class天下独行,最本质的区别是class是引用类型,而struct是值类型,它们在内存中的分配情况有所区别.由此产生的一系列差异性,本文将做以全面讨论. 2. 基本概念 2.1. 什么是class? class(类)是面向对象编程的基本概念,是一种自定义数据结构类型,通常包含字段.属