c# 参数传递方式?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# 参数传递方式?相关的知识,希望对你有一定的参考价值。
两个数据类型:值类型,引用类型。
ref和out 都是传递数据的地址,能对源数据进行修改。
传值类型的数据 实际上传进去的是源数据的一个副本。为什么 按引用传递和输出参数 就可以传送源数据的地址,而传值类型不加ref只能传递源数据的一个副本?有人能 稍微深层次的 帮我解答一下吗?谢谢了!
C# 简介 C sharp(又被简称为“C#”)是微软公司在二OOO年六月发布的一种新的编程语言,并定于在微软职业开发者论坛(PDC)上登台亮相.C#是微软公司研究员Anders Hejlsberg的最新成果.C#看起来与Java有着惊人的相似;它包括了诸如单一继承,界面,与Java几乎同样的语法,和编译成中间代码再运行的过程.但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NET windows网络框架的主角。 在本文中,我将考察创建一种新计算机语言的一般动机,并将特别指明是什么原因导致了C#的出现.然后我将介绍C#和它与Java,c,c++的相似之处.其次我将讨论一些存在于Java和C#之间的高层次的,和基础的差别.我将以衡量在用多种语言开发大型应用程序的时候所需的知识(或者对这种知识的缺乏程度)来结束本文,而这正是.NET和C#的一个主要战略.目前,C#和.NET还只能以C#语言规则,以及Windows 2000的一个"d预览版本",还有MSDN上迅速增多的文档集子的形式获得(还没有最终定型)。 编辑本段定义 微软c#语言定义主要是从C和C++继承而来的,而且语言中的许多元素也反映了这一点。C#在设计者从C++继承的可选选项方面比Java要广泛一些(比如说structs),它还增加了自己新的特点(比方说源代码版本定义).但它还太不成熟,不可能挤垮Java、C#还需要进化成一种开发者能够接受和采用的语言。而微软当前为它的这种新语言大造声势也是值得注意的。目前大家的反应是:“这是对Java的反击” 。 C#更象Java一些,虽然微软在这个问题上保持沉默。这也是意料中的事情,我觉得,因为Java近来很成功而使用Java的公司都报告说它们在生产效率上比C++获得了提高。 Java所带来的巨大影响和大家对它的广泛接受已经由工作于这种语言和平台之上的程序员数量明显的说明了(估计世界范围内共有两百五十万程序员使用Java)。由这种语言写成的应用程序的数量是令人惊讶的并已经渗透了每一个级别的计算,包括无线计算和移动电话(比如日本发明的Java电话)。C#能够在用户领域获得这样的礼遇吗?我们必须等待并观望,就象已经由SSI公司的CEO和主席Kalpathi S. Suresh指出来的那样:"我发现所有这些都是渐进的。如果C#不存在,我们总能回到Java或C和C++。这些都不完全是新技术,它们在更大的意义上来说只是大公司制造的市场噱头。我们必须给他们时间安顿下来看看这些是不是真的对IT工业有什么影响。" 编辑本段C#从Java继承而来的特点 类:在C#中类的申明与Java很相似.这是合理的因为经验告诉我们Java模型工作得很好.Java的关键字import已经被替换成using,它起到了同样的作用.一个类开始执行的起点是静态方法Main().下面的Hello World程序展示了基本的形式: using System; class Hello static void Main() Console.WriteLine("Hello, world"); 在这个例子中,System这个名字指向一个包括了基本C#实用类集合的命名空间(namespace).这个命名空间包括了Console类,它在这个例子中被用来输出一个字符串.类可以是抽象的和不可继承的:一个被申明成abstract的类不能被实例化;它只能被用做一个基类.C#关键字lock就象Java关键字final,它申明一个类不是抽象的,但是它也不能被用做另一个类的基类.界面:就象在Java中一样,一个界面是一组方法集合的抽象定义.当一个类或结构体实现一个界面的时候,它必须实现这个界面中定义的所有方法.一个单一的类可以实现几个界面.也许以后会出现一些微妙的差别,但是这个特点看起来与Java相比没有变化.布尔运算:条件表达式的结果是布尔数据类型,布尔数据类型是这种语言中独立的一种数据类型.从布尔类型到其他类型没有直接的转换过程.布尔常量true和false是C#中的关键字.错误处理:如Java中那样,通过抛出和捕捉异常对象来管理错误处理过程.内存管理:由底层.NET框架进行自动内存垃圾回收. 编辑本段C#从C和C++继承的特点 编译:程序直接编译成标准的二进制可执行形式.如果前面的Hello World程序被保存成一个文本文件并被命名为Hello.cs,它将被编译成命名Hello.exe的可执行程序. 结构体:一个C#的结构体与C++的结构体是相似的,因为它能够包含数据声明和方法.但是,不象C++,C#结构体与类是不同的而且不支持继承.但是,与Java相同的是,一个结构体可以实现界面. 预编译:C#中存在预编译指令支持条件编译,警告,错误报告和编译行控制.可用的预编译指令有: #define #undef #if #elif #else #endif #warning #error #line [] 没有了#include 伪指令.你无法再用#define 语句对符号赋值,所以就不存在源代码替换的概念--这些符号只能用在#if和#elif伪指令里.在#line伪指令里的数字(和可选的名字)能够修改行号还有#warning和#error输出结果的文件名. 编辑本段操作符重载: 一些操作符能够被重载,而另一些则不能.特别的是,没有一个赋值运算符能够被重载.能够被被重载的单目操作符是: + - ! ~ ++ -- true false 能够被重载的二元运算符是: + - * / % & | ^ << >> == != > < >= <= 编辑本段C#独有的特点 C#最引人入胜的地方是它和Java的不同,而不是相似的地方.这一节(和这个系列第二部分的大部分地方)讲述了C#实现的和Java不同的地方或者Java根本没有的特点. 中间代码: 微软在用户选择何时MSIL应该编译成机器码的时候是留了很大的余地.微软公司很小心的声称MSIL不是解释性的,而是被编译成了机器码.它也明白许多--如果不是大多数的话--程序员认为Java程序要不可避免的比C编写的任何东西都要慢.而这种实现方式决定了基于MSIL的程序(指的是用C#,Visual Basic,"Managed C++"--C++的一个符合CLS的版本--等语言编写的程序)将在性能上超过"解释性的"Java代码.当然,这一点还需要得到事实证明,因为C#和其他生成MSIL的编译器还没有发布.但是Java JIT编译器的普遍存在使得Java和C#在性能上相对相同.象"C#是编译语言而Java是解释性的,"之类的声明只是商业技巧.Java的中间代码和MSIL都是中间的汇编形式的语言,它们在运行时或其它的时候被编译成机器代码. 命名空间中的申明: 当你创建一个程序的时候,你在一个命名空间里创建了一个或多个类.同在这个命名空间里(在类的外面)你还有可能声明界面,枚举类型和结构体.必须使用using关键字来引用其他命名空间的内容. 基本的数据类型 :C#拥有比C,C++或者Java更广泛的数据类型.这些类型是bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,和decimal.象Java一样,所有这些类型都有一个固定的大小.又象C和C++一样,每个数据类型都有有符号和无符号两种类型.与Java相同的是,一个字符变量包含的是一个16位的Unicode字符.C#新的数据类型是decimal数据类型,对于货币数据,它能存放28位10进制数字. 两个基本类: 一个名叫object的类是所有其他类的基类.而一个名叫string的类也象object一样是这个语言的一部分.作为语言的一部分存在意味着编译器有可能使用它--无论何时你在程序中写入一句带引号的字符串,编译器会创建一个string对象来保存它. 参数传递: 方法可以被声明接受可变数目的参数.缺省的参数传递方法是对基本数据类型进行值传递.ref关键字可以用来强迫一个变量通过引用传递,这使得一个变量可以接受一个返回值.out关键字也能声明引用传递过程,与ref不同的地方是,它指明这个参数并不需要初始值. 与COM的集成: C#对Windows程序最大的卖点可能就是它与COM的无缝集成了,COM就是微软的Win32组件技术.实际上,最终有可能在任何.NET语言里编写COM客户和服务器端.C#编写的类可以子类化一个以存在的COM组件;生成的类也能被作为一个COM组件使用,然后又能使用,比方说,JScript语言子类化它从而得到第三个COM组件.这种现象的结果是导致了一个运行环境的产生,在这个环境里的组件是网络服务,可用用任何.NET语言子类化. 索引下标: 一个索引与属性除了不使用属性名来引用类成员而是用一个方括号中的数字来匿名引用(就象用数组下标一样)以外是相似的. public class ListBox: Control private string[] items; public string this[int index] get return items[index]; set items[index] = value; Repaint(); 可以用一个循环器来匿名引用字符串内部数组成员,就象下面这样: ListBox listBox = ...; listBox[0] = "hello"; Console.WriteLine(listBox[0]); 代理和反馈: 一个代理对象包括了访问一个特定对象的特定方法所需的信息.只要把它当成一个聪明的方法指针就行了.代理对象可以被移动到另一个地方,然后可以通过访问它来对已存在的方法进行类型安全的调用.一个反馈方法是代理的特例.event关键字用在将在事件发生的时候被当成代理调用的方法声明中.
参考技术A
引用参数以ref为关键字,这种参数是要在调用之前就初始化的。这参数一般情况下是从外部向内部传递数值的时候使用,对于托管代码加ref和不加基本相同,但是对于托管代码就有所区别。
输出参数以out为关键字,这种参数不需要输入确定的值,实际的对象是在方法内部初始化,由方法内部给这种参数赋值。一般是调用该方法之后,需要方法输出一些数据的时候使用。因为有时候方法的返回值可能用作他用,而这时还想让方法输出其他的数据,就可以使用out参数了。
参考技术B
程序中默认的是值类型传递,引用类型传递其实也是一个值,只不过这个值是一个地址而已;传值的时候是具体数据的副本,而传地址的时候是一个地址的副本;地址的副本其实指向的都是同一个地方,所以修改后会有影响
参考技术C
唉,楼上的回答那么好,看来我拿不到分了。“栈中只存堆中的地址。所以值类型,传递的是值,引用类型传递的是栈中的指针。”楼上的说的太好了,不愧称为高人!
参考技术D
宝贝,你很让我吃惊,也很感动......首先你应该了解.net中的内存分配。值类型是在栈中分配,而引用类型的值在堆中分配,栈中只存堆中的地址。所以值类型,传递的是值,引用类型传递的是栈中的指针。有时间我陪你一起去看看.netframework技术内幕这本书。么么
使用 C# 在表单之间传递数据的最佳方式
【中文标题】使用 C# 在表单之间传递数据的最佳方式【英文标题】:Best way to pass data between forms using C#
【发布时间】:2012-11-12 17:06:51
【问题描述】:
这更像是一个基于理论的问题。我正在为我的最后一个 C# 项目进行设计,即创建 Jeopardy。我的问题是,在它们之间传递数据的最佳方式是什么?例如,规则要求游戏在启动画面显示后打开一个选项屏幕。在这里,他们将选择玩家的数量和他们的名字。我知道在我的游戏表单加载事件中,我可以将这些东西指定为参数并将它们作为选项表单中的参数传递。不过,这似乎很混乱,是否有更有效的方法来创建项目范围的变量,无论我当前使用何种形式,我都可以引用这些变量?
感谢您的任何回答,我们始终不胜感激!
-- 年轻的学徒程序员
【问题讨论】:
全局变量通常被认为是不好的做法。我建议阅读 MVC 模式。 Here's an article I just googled.我只是略读了一下,但它似乎是一个合理的起点。
好东西!谢谢尼克!
【参考方案1】:
如何使用静态属性或单例模式创建一个单独的业务对象(即类)。然后,您可以将所有应用程序值存储在那里,您可以从应用程序中的任何位置引用它们,而无需在各处传递变量的繁琐工作。
【讨论】:
这是正确的答案。我看到太多关于在表单之间访问数据的问题,也有太多人解释如何使成员公开或通过构造函数传递对另一个表单的引用,而没有解决关注点分离、分层和抽象的基本问题。
感谢 Sam,我会将其应用到我的项目中。以上是关于c# 参数传递方式?的主要内容,如果未能解决你的问题,请参考以下文章
c#中方法的参数可以有哪几种传递方式
C#在方法调用中,参数按值传递与按引用传递的区别是啥?
c#中关于启动进程时的参数传递问题
C#中的默认参数传递
C#中数组作为参数传递的问题
如何用c#调用c++的dll传递各种稀奇古怪的参数。