向方法中传递参数分为 值传递 和 引用传递 ,值传递顾名思义只传给方法值,引用传递就是传了地址,保留对参数值的修改(用ref修饰参数)我这两天实现了窗体间的数据传递(一个是子窗体文本框鼠标坐标传给父窗体标题栏,一个是模拟IM软件,在头像选择窗体回传选择头像给主窗体)但是两种方法都没有用到ref修饰参数,代码里面也没有体现出对传入参数的修改(比如PictureBox m   frmParent theMouse),自己做完实现了都很糊涂,很奇怪为什么保留了对值的修改,怎么会是引用传递了呢?
我传递参数的理解没到家,请大家指正!求求大家能有耐心看我的代码了
子窗体传鼠标坐标给父窗体:
---------------------------------------------父窗体代码:        public frmParent()
        {
            InitializeComponent();            
        }
        //点击按钮弹出子窗体,给进参数为本窗体
        private void button1_Click(object sender, EventArgs e)
        {
            frmChild ShowForm1 = new frmChild(this);
            ShowForm1.MdiParent = this;
            ShowForm1.Show();
        }
子窗体代码:        frmParent cc; //声明父窗体对象        //StatusStrip cc;
        public frmChild(frmParent theMouse)
        {
            InitializeComponent();            cc=theMouse;  //给父窗体对象赋值
            
        }        //捕获子窗体文本框鼠标,并在父窗体标题栏显示
        private void textBox1_MouseMove(object sender, MouseEventArgs e)
        {
            string get = string.Format("捕捉到鼠标({0},{1})", e.X, e.Y);
            
            //cc.Items.Clear();
            //cc.Items.Add(get);
            cc.Text = get;
            
        }传递选择的头像给主窗体:
-------------------------------------------------------------主窗体代码:    public partial class frmQQMainForm : Form
    {
        int index=0; //头像索引值        public frmQQMainForm()
        {
            InitializeComponent();
                        
        }
                //窗体开始时初始化头像
        private void Form1_Load(object sender, EventArgs e)
        {
            picHead.Image = ilImages.Images[index];
            
        }        //当点击QQ主窗体头像时,弹出选择头像窗体
        private void picHead_Click(object sender, EventArgs e)
        {            
            frmSelectHead showSelectForm = new frmSelectHead(index,picHead);
            showSelectForm.Show();
        }
        
    }
选择头像窗体代码:        int number; //现在头像的索引
        PictureBox changeHead; //声明图片控件对象        //构造方法初始化现在的头像,
        //QQ主窗体index参数传递给选择头像窗体,
        //初始化头像的索引
        public frmSelectHead(int n,PictureBox m)
        {
            InitializeComponent();            number = n;
            changeHead = m;       
            
        }        //加载窗体时显示现在主窗体的头像
        private void frmSelectHead_Load(object sender, EventArgs e)
        {
            picCorrentHead.Image = ilQQHeadList.Images[number];            pic_1.Image = ilQQHeadList.Images[0];
            pic_1.Tag = 0;            pic_2.Image = ilQQHeadList.Images[1];
            pic_2.Tag = 1;            pic_3.Image = ilQQHeadList.Images[2];
            pic_3.Tag = 2;            pic_4.Image = ilQQHeadList.Images[3];
            pic_4.Tag = 3;            pic_5.Image = ilQQHeadList.Images[4];
            pic_5.Tag = 4;        }        /*点击图片显示相应头像*/
        private void pic_Choice_Click(object sender, EventArgs e)
        {
            //得到选择头像的索引
            int ChangeIndex = Convert.ToInt32(((PictureBox)sender).Tag);            //显示选择了的头像
            picCorrentHead.Image = ilQQHeadList.Images[ChangeIndex];             //换主窗体的头像
            changeHead.Image = ilQQHeadList.Images[ChangeIndex];            //picCorrentHead.Image.Tag=((PictureBox)sender).Tag;
        }

解决方案 »

  1.   

    凡是传递的对像都是引用传递的,只有传递数字值的时候才汲及这个问题。
    可以这样 void Test(out int x){x=100;}这样修改的x就会传出来的,否则不会。
      

  2.   


    C#的所有值类型均隐式派生自System.ValueType:
     结构体:struct(直接派生于System.ValueType); 数值类型: 整 型:sbyte(System.SByte的别名),short(System.Int16),int(System.Int32),long (System.Int64),byte(System.Byte),ushort(System.UInt16),uint (System.UInt32),ulong(System.UInt64),char(System.Char); 
    浮点型:float(System.Single),double(System.Double); 
    用于财务计算的高精度decimal型:decimal(System.Decimal)。 
    bool型:bool(System.Boolean的别名); 
    用户定义的结构体(派生于System.ValueType)。 
    枚举:enum(派生于System.Enum); 
    可空类型(派生于System.Nullable<T>泛型结构体,T?实际上是System.Nullable<T>的别名)。 
    每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
      

  3.   

    this 是 系统指针,默认就是地址引用