您的位置:首页 > 编程语言 > C#

C# 引用类型作为函数参数时一些需要注意的地方

2012-08-03 17:06 537 查看
1.请看下面的这个例子:

----------定义一个类-------------------

    public class RefClass

    {

        public int IntValue

        {

            get;

            set;

        }

    }

----------定义四个静态方法-------------------

        #region 测试值传递

        static void AddValue(RefClass prc)//RefClass *prc,prc和传进来的rc指向同一个RefClass对象的地址

        {

            prc.IntValue++; //prc->IntValue++;

        }

        static void AddValue(ref RefClass prc)//RefClass **prc,prc指向传进来的rc的地址

        {

            prc.IntValue++;//(*prc)->IntValue++;

        }

        static void ChangeRef(RefClass prc)//RefClass *prc,prc和传进来的rc指向同一个RefClass对象的地址

        {

            prc = new RefClass() { IntValue = 1000 };

            //prc=new RefClass() { IntValue = 1000 };请注意new关键字在C++中创建的是指向对象的指针不是对象

        }

        static void ChangeRef(ref RefClass prc)//RefClass **prc,prc指向传进来的rc的地址

        {

            prc = new RefClass() { IntValue = 1000 };

            //*prc=new RefClass() { IntValue = 1000 };请注意new关键字在C++中创建的是指向对象的指针不是对象

        }

        #endregion

----------测试方法-------------------

        private void button3_Click(object sender, EventArgs e)

        {

            string ResultMsg = "";

            RefClass rc = new RefClass() { IntValue = 1 };//RefClass *rc=new RefClass() { IntValue = 1 };请注意new关键字在C++中创建的是指向对象的指针不是对象

            AddValue(rc);//rc,传递指向RefClass对象的指针

            ResultMsg+="调用AddValue(rc)后IntValue为:" + rc.IntValue.ToString() + "\r\n";

            rc.IntValue = 1;//(注意这里重新把IntValue的值赋值为了1)
            AddValue(ref rc);//&rc,传递指向RefClass对象指针的指针

            ResultMsg += "调用AddValue(ref rc)后IntValue为:" + rc.IntValue.ToString() + "\r\n";

            rc.IntValue = 1;

            ChangeRef(rc);//rc,传递指向RefClass对象的指针

            ResultMsg += "调用ChangeRef(rc)后IntValue为:" + rc.IntValue.ToString() + "\r\n";

            rc.IntValue = 1;

            ChangeRef(ref rc);//&rc,传递指向RefClass对象指针的指针

            ResultMsg += "调用ChangeRef(ref rc)后IntValue为:" + rc.IntValue.ToString() + "\r\n";

            MessageBox.Show(ResultMsg);

        }

----------测试结果截图-------------------



----------结果分析-------------------

1.第一个函数AddValue(rc),形参指向了和实参一样的一个地址的拷贝,注意是拷贝

   修改形参指向对象的属性值,直接会影响实参的指向对象的属性值,因为它们指向了同一个地址(虽然是拷贝),结果为2

2.第二个函数AddValue(ref rc),形参指向了和实参一样的一个地址,注意,这里是同一个地址,形参地址

   的改变会直接导致实参地址的改变,它不是拷贝,和第一个函数一样,修改形参指向对象的属性值,肯定会直接回影响实参的指向对象的属性值,结果为2

3.第三个函数ChangeRef(rc),在这个函数里面prc = new RefClass() { IntValue = 1000 };,重新把形参指向了了一个新的地址

    注意是指向了一个新的地址,因为它new了一个新的对象,而没有改变实参地址指向对象的属性值,由于它只是实参地址的一个拷贝,所以结果为1

4.第四个函数ChangeRef(ref rc),由于加上了ref关键字,形参指向了和实参一样的一个地址,它不是拷贝,所以

   当形参指向了一个新的地址时,实参的地址也跟着改变了,所以结果为1000

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息