还是窗口传值   AFrom窗体和BForm窗体和Info类  
  public Info
{
    public string Name{get;set;}
}BForm构造函数 
private Info binfo;
public BForm(Info _info){this.binfo=_info;this.binfo="YYYY";}然后就是AForm按钮打开BForm窗口
private void button1_Click(object sender, EventArgs e)
{
    Info info=new Info();
    info.Name="XXX";
    BForm bform=new BForm(info);
    bform.ShowDialog();
    MessageBox.Show(info.Name);

打开bform之后,我发现在bform中改变binfo之后,AForm窗口中的info也随之改变了,这是怎么回事?为什么info也变成了YYYY?有什么办法info.Name不会被BForm改变?

解决方案 »

  1.   

    原来的代码是 public class Info 吧?
    改成 public struct Info
      

  2.   

    传来传去,info传递的都是指针,指向的是同一个对象,除非你创建两个实例,分别给a和b
      

  3.   


    有点急,掉了一个Class public class Info
    {
      public string Name{get;set;}
    }
      

  4.   

    A和B在使用同一个对象,当然会变了。你在B中重新new一个info的对象不就行了
      

  5.   

    不要把改变info的代码写在构造函数里面
      

  6.   


    我试过这样,但是还是相同结果private void button1_Click(object sender, EventArgs e)
    {
      Info info=new Info();
      info.Name="XXX";  Info info2=info;
      BForm bform=new BForm(info2);
      bform.ShowDialog();
      MessageBox.Show(info.Name);
    }  结果还是显示YYYY
      

  7.   


    一定要改成 struct ?
      

  8.   


    最简单的方法而已。
    这里还是同一个对象啊先了解一下值类型(struct)和引用类型(class)的区别吧
      

  9.   

    对于值类型变量,深拷贝和前拷贝都是通过赋值操作符号(=)实现
    浅拷贝使用Object类MemberwiseClone实现  
    MemberwiseClone:创建当前 Object 的浅表副本
    浅拷贝(shallow copy)对于引用类型对象中的值类型字段进行了逐位复制。赋值运算符只是把源对象的引用赋值给目的对象,两者引用同一个对象。
    浅拷贝后的对象的值类型字段更改不会反映到源对象,而赋值运算后的对象的值类型字段更改会反映到源对象 
      

  10.   


    我Clone就行了BForm bform=new BForm((Info)info.Clone());谢谢