一道C#代码问题!关于ref变量,烦请各位大侠帮忙!
//判断gTCardNumber卡号是否存在publicboolLoginNormal(stringgTCardNumber,refUsercurrentUser){bo...
//判断gTCardNumber卡号是否存在
public bool LoginNormal(string gTCardNumber, ref User currentUser)
{
bool result = false;
currentUser = userService.IsUserExisted(gTCardNumber, 0);//根据钢通卡号返回此用户信息
if (currentUser != null)
{
result = true;
}
return result;
}
我的问题是 LoginNormal(string gTCardNumber, ref User currentUser)此方法中,为什么要用ref 变量呢?不加会有什么后果呢? 展开
public bool LoginNormal(string gTCardNumber, ref User currentUser)
{
bool result = false;
currentUser = userService.IsUserExisted(gTCardNumber, 0);//根据钢通卡号返回此用户信息
if (currentUser != null)
{
result = true;
}
return result;
}
我的问题是 LoginNormal(string gTCardNumber, ref User currentUser)此方法中,为什么要用ref 变量呢?不加会有什么后果呢? 展开
7个回答
展开全部
ref代表引用。如果你用过C++可能会说起来更明白一些。
这是C#函数调用的概念问题。对于一个函数的参数列表,不加ref时,对于值类型的参数,在传参的时候,是将参数的值复制了一份传进来,若是加了ref则是直接对这个参数进行处理!而对于引用类型的参数差别不大。以你的函数为例:
public bool LoginNormal(string gTCardNumber, ref User currentUser)
如果我这么调用:LoginNormal(myName, myUser)------myName和myUser前面已经定义好的
实际上就是将myName复制了一份传给LoginNormal函数,而myUser是直接操作的。具体效果是,在LoginNormal里,gTCardNumber有什么操作,不会影响myName;但是currentUser有什么操作,会直接改变myUser。
【注】User类型应该是你定义的类,而类是引用类型的数据,ref User currentUser里面这个ref加和不加,效果是一样的。
给你做个最简单的例子吧,对于值类型的数据,这个ref才有明显的作用:
先定义一个数int a=5;看以下两种情况
void DataOp1(int n)
{
n=n+1;
}
这个函数,调用DataOp1(a)之后,a没有变化,因为将a的值复制一份传给函数了。
void DataOp2(ref int n)
{
n=n+1;
}
这个函数,调用DataOp2(a)之后,a=6,因为直接操作的a
这是C#函数调用的概念问题。对于一个函数的参数列表,不加ref时,对于值类型的参数,在传参的时候,是将参数的值复制了一份传进来,若是加了ref则是直接对这个参数进行处理!而对于引用类型的参数差别不大。以你的函数为例:
public bool LoginNormal(string gTCardNumber, ref User currentUser)
如果我这么调用:LoginNormal(myName, myUser)------myName和myUser前面已经定义好的
实际上就是将myName复制了一份传给LoginNormal函数,而myUser是直接操作的。具体效果是,在LoginNormal里,gTCardNumber有什么操作,不会影响myName;但是currentUser有什么操作,会直接改变myUser。
【注】User类型应该是你定义的类,而类是引用类型的数据,ref User currentUser里面这个ref加和不加,效果是一样的。
给你做个最简单的例子吧,对于值类型的数据,这个ref才有明显的作用:
先定义一个数int a=5;看以下两种情况
void DataOp1(int n)
{
n=n+1;
}
这个函数,调用DataOp1(a)之后,a没有变化,因为将a的值复制一份传给函数了。
void DataOp2(ref int n)
{
n=n+1;
}
这个函数,调用DataOp2(a)之后,a=6,因为直接操作的a
2014-01-14 · 知道合伙人数码行家
关注
展开全部
ref 关键字使参数按引用传递。 其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。
如下面一个例子:
class RefExample
{
static void Method(ref int i)
{
// Rest the mouse pointer over i to verify that it is an int.
// The following statement would cause a compiler error if i
// were boxed as an object.
i = i + 44;
}
static void Main()
{
int val = 1;
Method(ref val);
Console.WriteLine(val);
// Output: 45
}
}
调用Method方法后,i的值累加后反应在Main方法的val变量上,输出45.
如果不加ref,不会只会输出1,方法Method中的累加不会影响val的值。
注意点:传递到 ref 参数的参数必须最先初始化。
参考链接:http://msdn.microsoft.com/zh-cn/library/vstudio/14akc2c7(v=vs.100).aspx
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
class Program
{
static void Main(string[] args)
{
C c = new C();
Console.WriteLine(c.n);//0
F1(c);
Console.WriteLine(c.n);//1
List<C> cs = new List<C>() { new C() };
Console.WriteLine(cs.Count);//1
F2(cs);
Console.WriteLine(cs.Count);//1
F3(ref cs);
Console.WriteLine(cs.Count);//0
Console.ReadLine();
}
//不需要
private static void F1(C c)
{
c.n = 1;
}
//不需要
private static void F2(List<C> cs)
{
cs = new List<C>();
}
//在函数内部new list,则必须用ref
private static void F3(ref List<C> cs)
{
cs = new List<C>();
}
}
public class C
{
public int n;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
ref 表示currentUser这个参数是引用参数,在LoginNormal函数中对currentUser的修改,会直接影响你调用函数时传入的对象。如果去掉的话,编译器对LoginNormal函数,会对传入的参数创建一个副本,副本作用域就是函数的作用域,函数结束副本参数就被释放掉了,因此在函数中修改参数,不会影响你传入的对象。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
假设
currentUser 这个变量如果原来的值是A
这个userService.IsUserExisted(gTCardNumber, 0) 的返回值是B.
那么在你调用方法LoginNormal后, currentUser 就会变成B.
ref 可以理解为变量的值经过方法后,变成了一个新值并传回来给你用.
currentUser 这个变量如果原来的值是A
这个userService.IsUserExisted(gTCardNumber, 0) 的返回值是B.
那么在你调用方法LoginNormal后, currentUser 就会变成B.
ref 可以理解为变量的值经过方法后,变成了一个新值并传回来给你用.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询