ZKX's LAB

c#中值类型和引用类型的区别 ref 引用类型

2020-08-11知识3

关于C#的ref引用传参描述怎样理解比较好 这个例子笼统来看,是正确的,但举得确实不怎么高明,如果用它来理解ref,分明有越搅越浑之嫌。如果严格来看,这个例子甚至是不正确的。我们知道,C#里的数据类型分为两类,一是值类型,一是引用类型。ref只针对值类型使用。值类型有一个最大的特点,就是你把它赋给任何“人”,它都是采用“复制”方式。如果我们也举一个例子,相当于有人来找你出去,作为值类型的你并没有亲自去,而是临时“克隆”了一个自己,派这个“克隆你”去。结果是如何呢?那个克隆的你在外面不管发生了什么事,玩嗨了也好,受伤了也罢,都不会影响你。引用类型就不同了,引用类型的你总是“亲力亲为”,谁叫你你都亲自去,所以任何变化都发生在自己身上。那么有时候,程序员也希望值类型的你能够直接一些,叫你去就是想对你做些改变,怎么办呢?那就要用ref修饰来明确告诉你,你必须亲自来。当然了,你亲自去的后果就是有什么玩嗨了,受伤了的事情,就直接承受在你自己身上。总结来说呢,你可以认为,一个加了ref的值类型参数,你可以临时把它看成是一个引用类型。写完之后,发现这个例子好像也不是特别生动,倒有些恐怖,不知道对你有没有帮助。请问一下C#里面的引用是怎么回事,为什么加上ref之后就相当于c++里的应用了 using Microsoft.Office.Interop.Word;导出Word引用至于检索,我还没有研究过。示例代码:Word.Document mydoc=new Word.Document();实例化Word文档对象Word.Table mytable;声明Word表格Word.Selection mysel;声明Word选区Object myobj;if(dGV.Rows.Count=0)return;建立Word对象Word.Application word=new Word.Application();myobj=System.Reflection.Missing.Value;mydoc=word.Documents.Add(ref myobj,ref myobj,ref myobj,ref myobj);word.Visible=true;mydoc.Select();mysel=word.Selection;将数据生成Word表格文件mytable=mydoc.Tables.Add(mysel.Range,dGV.RowCount,dGV.ColumnCount,ref myobj,ref myobj);设置列宽mytable.Columns.SetWidth(80,Word.WdRulerStyle.wdAdjustNone);输出列标题数据for(int i=0;i;i+){mytable.Cell(1,i+1).Range.InsertAfter(dGV.Columns[i].HeaderText);}输出控件中的记录for(int i=0;i;i+){for(int j=0;j;j+){mytable.Cell(i+2,j+1).Range.InsertAfter(dGV[j,i].Value.ToString());}}如何理解用out或ref修饰的引用类型的参数(不是用ref out 修饰值类型)? out或ref修饰引用类型可以认为是传递了引用地址的地址。比如:int MaxVal(ref int[]maxValIndices){maxValIndices[0]=5;对于这个加不加无所谓maxValIndices=new int[]{};对于这个,如果想影响原数组必须加Ref 或者Out}main(){int[]aa=new int[]{1,2,3};MaxVal(aa);}假如不加out 因为你里面是new了一个新数组,意味着产生了一个新的引用地址,那么外面的数组是不能随之而改变的。c#中值类型和引用类型的区别 1、速度上的区别值类型存取速度快,引用类型存取速度慢。2、用途上的区别值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用。3、来源上的区别值类型继承自System.ValueType,引用类型继承自System.Object4、位置上的区别值类型的数据存储在内存的栈中,引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。5、类型上的区别值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。6、保存位置上的区别值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际数据则保存在堆中。例如:字符串类型,而堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量占用四个字节)。由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用,即在堆栈中保存的是同一个堆的地址。在进行数据操作时,对于值类型,由于每个变量都有自己的值,因此对一个变量的操作不会影响到其它变量;对于引用类型的变量,对一个变量的数据进行操作。参数中的ref,如果参数是引用类型,好像用不用ref都是一样的效果,是吗 是的.引用类型,默认就是引用传递.只有对于值类型时,才会特意用ref,out来传递.C#中值类型参数与引用类型参数的区别。??如 Public static void AddOne(ref int a) { a++ } 值类型 传递给函数是一个具体指引用类型 传递给函数的是一个地址如果想在函数中改变外面的值,必须用引用才可以REF表示将参数作为引用类型传入所以即使它是值类型(比如INT型),也视作引用,函数中的变化会作用到其本身比如int a=8;AddOne(ref a);则a的值为9.如果是AddOne(a);则a的值不变关于C#中给引用类型加上“REF”后有什么不同 ref关键字传递栈地址 引用类型传递的是堆地址 如果你把ref 使用到引用类型上那么就会把引用类型的地址传递过去 而不是把引用类型应用的堆地址传递过去 引用类型:他的引用是。C#值类型和引用类型有什么不同? 值类型和引用类型有很多不同。下面列一些马上可以想到的。1、值类型存储在栈内存或堆内存之中,而引用类…

#变量#引用类型#string

随机阅读

qrcode
访问手机版