请教:C#中的引用类型作为方法参数,为什么不是传地址调用的? 天哪!你们都没有明白我的意思啊!我是说,如果方法参数前面不加上ref,引用类型还是不能传地址调用啊!我觉得引用类型应该是不需要加上ref就能传地址调用的。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我没语言了,楼主好像发现了新大陆你用一个这样的例子就说明了你的观点????我还是做个简单的解释吧,在C#里面,string为静态类型,在付初值后,其内容是不允许修改的。(这一点我想看过书的都知道)比如string str = "1234";str[0] = "a";这样的语法是不能编译的而string str = "1234";str = "abcd";为什么能能通过,str = "abcd"实际上是重新创建了一个string对像,现在的str已经不是原来的那个str了。那原来的str怎么办(你现在已经访问不到他了,他只有等待被GC回收,当然如果是函数的应用传递的话,那情况就是另外回事了)现在来说说你的问题test(b)确实是引用传递,毋用怀疑。那为什么在函数里面没有修改到他的值呢?那是因为在函数里a="12345"的时候,系统给这个a重新分配了一个string对象。函数里面的a和他的传入参数已经不是指向一个地址了。所以。这让你认为"这是值传递"你如果传入是一个非静态类型的话,比如ArrayList,你在函数里面修改ArrayList的内容就能反映到函数外(因为它是应用传递) 请问Object类型是不是也是象你说的一样是静态类型; 在c#中变量分两种,值类型(继承自System.Type)和引用类型(System.Object继承)引用类型的用法如:DataSet ds=new DataSet();DataSet ds1=ds;这时,只有一个DataSet对象,ds和ds1引用他值类型:string s="abc";string s1=s;这时实际上有两个字符串,所以s1+="1";之后s不会改变. string是值类型不是引用类型(这个很好区分,在msdn里如果值类型通常叫"结构",如DateTime结构,而引用类型通常叫类,如Object类).之所以要这样分是因为性能方面的原因,引用类型是分配在托管堆中并且在new的时候需要构建一些关联信息,这些信息是额外的。如果一个程序里连int,string这样的简单数据类型都需要附加额外的关联信息的话会很大的损伤性能,因而对于int,string变量,.net把他们直接分配在线程的堆栈中,并且只存放相关数据,没有关联信息,这在性能上得到了提高,但同时也限制了这些变量无法被引用,因为没有关联信息。但是在.net中有一种替代方案,就是装箱/拆箱,通过装箱:string s="abc";object o=(object)s;.net把值类型的数据放到了托管堆中,因些可以被引用了拆箱反之。ref的功能应该就是实现这样的操作(猜的;-) 楼上错了!string 是引用类型!!!查一下MSDN就知道!!!引用类型的变量又称为对象,可存储对实际数据的引用。包括: class、interface、delegate及两个内置引用类型object、string值类型主要由两类组成: Struct(结构)类型 枚举类型 结构类型包括用户定义的 struct 类型以及内置的简单类型。 ModelBuilder 的命名空间是哪个? datagridview怎么分页 C# winform中datagridview的下拉框怎么用,如何绑定List数据源 webBrowser 弹出窗口问题 C# 屏蔽某个按键 [严重]关于office版本与winform引用dll的问题! winform中textbox输入字符问题 DataGridView怎么实现底行合计? 好像是没有进行属性刷新,该如何操作呢?请高手指教 DrawString时,怎么设置字符间距? 求救.请用过visual C#.net 的朋友都来帮我一下.不胜感激. 数据库插入数据,如果某一字段是设有默认值,要怎么操作!
你用一个这样的例子就说明了你的观点????我还是做个简单的解释吧,在C#里面,string为静态类型,在付初值后,其内容是不允许修改的。(这一点我想看过书的都知道)
比如
string str = "1234";
str[0] = "a";
这样的语法是不能编译的而
string str = "1234";
str = "abcd";
为什么能能通过,str = "abcd"实际上是重新创建了一个string对像,现在的str已经不是原来的那个str了。那原来的str怎么办(你现在已经访问不到他了,他只有等待被GC回收,当然如果是函数的应用传递的话,那情况就是另外回事了)现在来说说你的问题
test(b)确实是引用传递,毋用怀疑。那为什么在函数里面没有修改到他的值呢?
那是因为在函数里a="12345"的时候,系统给这个a重新分配了一个string对象。函数里面的a和他的传入参数已经不是指向一个地址了。所以。这让你认为"这是值传递"你如果传入是一个非静态类型的话,比如ArrayList,你在函数里面修改ArrayList的内容就能反映到函数外(因为它是应用传递)
引用类型的用法如:
DataSet ds=new DataSet();
DataSet ds1=ds;
这时,只有一个DataSet对象,ds和ds1引用他
值类型:
string s="abc";
string s1=s;
这时实际上有两个字符串,所以
s1+="1";之后s不会改变.
之所以要这样分是因为性能方面的原因,引用类型是分配在托管堆中并且在new的时候需要构建一些关联信息,这些信息是额外的。如果一个程序里连int,string这样的简单数据类型都需要附加额外的关联信息的话会很大的损伤性能,因而对于int,string变量,.net把他们直接分配在线程的堆栈中,并且只存放相关数据,没有关联信息,这在性能上得到了提高,但同时也限制了这些变量无法被引用,因为没有关联信息。
但是在.net中有一种替代方案,就是装箱/拆箱,通过装箱:
string s="abc";
object o=(object)s;
.net把值类型的数据放到了托管堆中,因些可以被引用了
拆箱反之。ref的功能应该就是实现这样的操作(猜的;-)
string 是引用类型!!!查一下MSDN就知道!!!引用类型的变量又称为对象,可存储对实际数据的引用。包括:
class、interface、delegate及两个内置引用类型object、string值类型主要由两类组成:
Struct(结构)类型
枚举类型
结构类型包括用户定义的 struct 类型以及内置的简单类型。