一道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 变量呢?不加会有什么后果呢?
展开
 我来答
allenlew312
2014-01-14 · TA获得超过297个赞
知道小有建树答主
回答量:99
采纳率:0%
帮助的人:73.5万
展开全部
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
FoolRabbit编程
2014-01-14 · 知道合伙人数码行家
FoolRabbit编程
知道合伙人数码行家
采纳数:619 获赞数:3805
毕业于苏州大学,4年编程经验,对WPF有研究。

向TA提问 私信TA
展开全部

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

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
阳光的雷咩咩
2014-01-14 · TA获得超过1.4万个赞
知道大有可为答主
回答量:2.3万
采纳率:66%
帮助的人:7829万
展开全部
    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;
    }
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ly17227720
2014-01-14 · TA获得超过610个赞
知道小有建树答主
回答量:170
采纳率:100%
帮助的人:133万
展开全部
ref 表示currentUser这个参数是引用参数,在LoginNormal函数中对currentUser的修改,会直接影响你调用函数时传入的对象。如果去掉的话,编译器对LoginNormal函数,会对传入的参数创建一个副本,副本作用域就是函数的作用域,函数结束副本参数就被释放掉了,因此在函数中修改参数,不会影响你传入的对象。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
treeroots
2014-01-14
知道答主
回答量:29
采纳率:0%
帮助的人:23.7万
展开全部
假设
currentUser 这个变量如果原来的值是A
这个userService.IsUserExisted(gTCardNumber, 0) 的返回值是B.

那么在你调用方法LoginNormal后, currentUser 就会变成B.

ref 可以理解为变量的值经过方法后,变成了一个新值并传回来给你用.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式