社区
C#
帖子详情
对于引用类型,作为参数传递时,使用ref或out和不使它有什么区别?
zzzl
2003-09-13 05:46:40
rt
...全文
141
12
打赏
收藏
对于引用类型,作为参数传递时,使用ref或out和不使它有什么区别?
rt
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
dingfuhai
2003-12-17
打赏
举报
回复
我的理解,在swap(Class1 a,Class1 b)中,参数a,b传入函数是将他们的值(类似C++的对象指针)拷贝一份传了进去,因为这个值和a一样,他们都对应heap里相同的对象,所以函数内部可以修改该对象的成员的内容,但是对a的任何修改在函数结束时都被丢弃掉,所以a还是指向heap中的那个对象。如果以ref传入,函数内就有了一个a指针的一个别名而已,这个别名就是a,而不是a的拷贝。
dingfuhai
2003-12-17
打赏
举报
回复
以上不用ref也可以改变a.X,和b.Num1的值
dingfuhai
2003-12-17
打赏
举报
回复
class MyMain
{
void swap(ref A a,ref B b)
{
int temp;
temp=a.X;
a.X=b.Num1;
b.Num1=temp;
Console.WriteLine("swap 函数内 A.X={0} B.Num1={1}",a.X,b.Num1);
}
static void Main()
{
A a=new A();
a.X=1;
B b=new B();
b.Num1=2;
MyMain m=new MyMain();
Console.WriteLine("swap 函数执行前 A.X={0} B.Num1={1}",a.X,b.Num1);
m.swap(ref a,ref b);
Console.WriteLine("swap 函数外 A.X={0} B.Num1={1}",a.X,b.Num1);
Console.ReadLine();
}
}
class A
{
public int X;
}
class B
{
public int Num1;
}
这是为什么?
zzzl
2003-09-13
打赏
举报
回复
明白了,呵呵~
AhBian
2003-09-13
打赏
举报
回复
上面的代码是随手写的,下面是可测试代码:
using System;
public class Class1
{
public string MyStr;
public Class1(string str)
{
MyStr = str;
}
public static void foo(Class1 var)
{
var = new Class1("B");
}
public static void foo(ref Class1 var)
{
var = new Class1("B");
}
public static void Main()
{
Class1 myClass1 = new Class1("A");
foo(myClass1);
Console.WriteLine(myClass1.MyStr); // 输出 A
foo(ref myClass1);
Console.WriteLine(myClass1.MyStr); // 输出 B
// 应该看到不同了吧。
}
}
AhBian
2003-09-13
打赏
举报
回复
完全不一样,此处我不说 out 了,而用不用 ref 是有明显的区别的。
public class Class1
{
public string MyStr;
public Class1(string str)
{
MyStr = str;
}
}
public void foo(Class1 var)
{
var = new Class1("B");
}
public void foo(ref Class1 var)
{
var = new Class1("B");
}
public static void Main()
{
class1 myClass1 = new class1("A");
foo(myClass1);
Console.WriteLine(myClass1.MyStr); // 输出 A
foo(ref myClass1)
Console.WriteLine(myClass1.MyStr); // 输出 B
// 应该看到不同了吧。
}
jjcccc
2003-09-13
打赏
举报
回复
zzzl(这个屠夫心狠手辣) 你太厉害了!
zzzl
2003-09-13
打赏
举报
回复
不是吧,我试过了,即使不加ref,在函数体内改变参数也会影响到函数外。
jjcccc
2003-09-13
打赏
举报
回复
ref 传递的是引用,你可以在函数对其操作,若改变了其值,退出函数后,作为ref参数的传入的变量的值也跟著变化。
若不加ref,则传递的是值,是变量或对象的拷贝,在函数体无论怎么对它操作,都不会影响传入前的值。
panyee
2003-09-13
打赏
举报
回复
那区别就是后面一段, 是否对此参数进行操作
out是必须有运算操作
要不编译不通过
zzzl
2003-09-13
打赏
举报
回复
如果已经实例化过了,那么加和不加ref有什么区别?
panyee
2003-09-13
打赏
举报
回复
ref是进入函数前必须实例化, 在函数体内不一定要对它进行操作
out进入函数前不一定实例化, 但函数体的每一个流程必须有一次对它的操作
C#之
ref
参数和out参数的
区别
1:什么是
ref
参数 ? , 2:什么是 out 参数? 1、
使用
ref
参数
时
,传入的参数必须先被初始化。对 out 参数而言,必须在方法中对其完成初始化。 2、
使用
ref
和 out
时
,在方法的参数和执行方法
时
,都要加
ref
或 out 关键字,以满足匹配。 3、out 适合用在需要 return 多个返回值的地方,而
ref
则用在需要被调用的方法,修改调用者的引用的
时
候。 什么
时
候选择用
ref
? 什么
时
候选择用 out ? 1、
ref
的
使用
:
使用
ref
进行参数的传递
时
,该参数在
Ref
Out修饰值类型与
引用类型
以及值传递与引用传递
前言 之前了解的都是
Ref
、Out修饰值类型的情况,今天来重点研究就一下
Ref
、Out修饰
引用类型
的情况 值类型与
引用类型
C#数据类型分为两大类:值类型与
引用类型
值类型:int、float、double、char、bool、struc等,存储在栈上,垃圾由系统自动回收,不经过GC
引用类型
:string、数组、类、接口等,引用存储在栈上,具体的数据存储在托管堆上。垃圾回收由GC控制,垃圾回收的规则参见
Ref
与Out修饰值类型参数 值类型的参数本来是值传递,加上
Ref
、Out之后相当于将引用传递了过去,
C#属性不能作为
ref
或者out的参数
使用
属性不能作为
ref
或者out的参数
使用
原因有下: 属性是类的 函数成员 只有数据成员(存储数据)才能做作为参数
使用
。
ref
和out参数值在内部实现
时
,需要将内存地址传给目标方法。由于属性可能是没有支持字段的虚字段,也有可能是只读/只写的,因此不可能传递其基础存储的地址。所以,不能将属性作为
ref
或out参数值来传递。 ...
ref
和out的
区别
,以及
使用
方法
在C#中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可
使用
ref
或out关键字。
ref
和out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量。它们的
区别
是: 1、
使用
ref
型参数
时
,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。 2、
使用
ref
和out
时
,在方法的参数和执行方法
时
,都要...
【C#小知识】方法
参数传递
中的
ref
、out、in关键字
今天我们来总结一下
参数传递
中的
ref
、out、in关键字,话不多说直接开始。 在方法进行
参数传递
时
,我们可以
使用
ref
、out、in关键字对参数进行修饰。当参数
使用
ref
、out、in修饰后,参数则会按引用传递,而非按值传递。 在
使用
ref
、out、in关键字
时
,需要在方法定义和方法调用处显示的
使用
关键字。下面就来看一下实际的
使用
案例,示例如下: using System; class Program { static void Main(string[] args) {
C#
110,534
社区成员
642,575
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章