改为
private static void gt(ref cls t,ref cls y)

解决方案 »

  1.   

    我知道改为:
    private static void gt(ref cls t,ref cls y)
    想要知道为什么private static void gt(cls t,cls y)会出现这种情况?
      

  2.   

    倒,我好象答过你的上篇帖子
    我记得我说是在静态存储区里面,就是static可是你没给分我
    之所以要ref是因为static只能对值类型操作
    而要对引用类型就只能用他的引用即:用引用引用他在堆里的地址!
    我不知道我说的清不清楚,你可看看有关引用方面的资料!
      

  3.   

    class test
    {
    static void Main()
    {
    test b=new test(); cls s  = new cls("class-s"),c = new cls("class-c");
    // 为什么能修改类s.p属性,却不修改类c?  
    b.gt(  s, c);
    System.Console.WriteLine("s.x = {0},c.x ={1}",s.x,c.x); }
    // 为什么能修改类s.p属性,却不修改类c?  
    private   void gt(  cls t,   cls y)
    {
    t.p=new cls("class-t.p");
    y = t.p;
    }

    class cls
    {
    public string x;
    public cls p; public cls(string s)
    {
    x=s;
    }
    }
    }}
    ---------------------------------------------
    class test
    {
    static void Main()
    {
    test b=new test();
    string s="hijklmno"; // 为什么能修改类s.p属性,却不修改类c?  
    b.gt( s);
    System.Console.WriteLine(s); }
    // 为什么能修改类s.p属性,却不修改类c?  
    private   void gt(  string temp)
    {
    temp="abcdefg";
    }


    }
    }
    C#中的参数是按值传递的。也就是它传递的是一个考贝。。所以不能修改。
    假如加上关健字ref 或是out的话它就是以引用传递了
    和静态还是非静态好像没什么关系。
    你的另外一个贴子我也试过了。应该就是这样的。不是因为你的参数是引用就可以修改它的值。关健的是要看它加没加ref,out关健字!
      

  4.   

    在给你个例子!
    class test
    {
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class Class1
    {
    public int x;

    }
    struct stuct
    {
    public int y;
    }
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
    Class1 a=new Class1();
            a.x=10;
    Console.WriteLine(a.x);//输出10
        Class1 c=a;//引用类型赋值将复制到一个对像的引用
    c.x=100;
    Console.WriteLine(a.x);//输入100
    stuct b=new stuct();
    b.y=20;
    Console.WriteLine(b.y);//输出20
    stuct d=b;//值类型赋值将复制一个对像的值
    d.y=200;
    Console.WriteLine(b.y);//输入20
    }
    }
    引类型赋值将复制到一个对像的引用,值类型赋值将复制一个对像的值,C#中的参数是按值传递的,关健字ref 或是out的话它就是以引用传递。
    (这些话是C#精髓里面说的)
      

  5.   

    to:yarshray(saga jion):
    静态还是非静态函数没有关系吧,我试过了,结果也一样!to snewxf(心疤):
    你也差不多理解我的想法了,我要问的问题是:在不加ref的前提下为什么可以修改类的属性,但就不能修改它自己的引用(指定另一个类)?争论就是这里:"类是引用类型,结构是值类型".
    既然类是引用类型,gt(cls y)可以说明:
    public void gt(cls y)
       {y.x = "方法gt修改了y.x的值";} 但gt(cls t,cls y)为什么能修改类属性,却不修改类的指向:  
    private   void gt(cls t,cls y)
    {t.p=new cls("class-t.p");
    y = t.p;}用语句gt(s,c);调用后,类c没有被修改.
    所以要问一下,类为参数时是以什么来传递参数的?
      

  6.   

    应该是值类型。
    它传递的它本身的一个考贝吧!而不是它本身的引用。(虽然它本身是一个引用)
    就像INT类型一样。它传递的是一个值过去。
    当然这个考贝的内容到底是什么我也说不清楚!呵呵!
      

  7.   


    class test
    {
    static void Main()
    {
    test b=new test(); cls s  = new cls("class-s"),c = new cls("class-c");
    // 为什么能修改类s.p属性,却不修改类c?  
    b.gt(  s, c);
    System.Console.WriteLine("s.x = {0},c.x ={1}",s.x,c.x); }
    // 为什么能修改类s.p属性,却不修改类c?  
    private   void gt(   cls t,    cls y)
    {
    t.p=new cls("class-t.p");
    y=t.p;
    Console.WriteLine(y.x);//这加了一句**结果就不同了。 }

    class cls
    {
    public string x;
    public cls p; public cls(string s)
    {
    x=s;
    }
    }
    }
    这样好像很明白了吧!y=t.p;也就是Y以被修改了。
    --------------------------------------------------
    class Class1
    {
    public int x;
    public Class1()
    {
    x=10;
    }
    public static void gt(Class1 y)
    {
    y.x=1000000;
    } /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
    Class1 c= new Class1();
    Console.WriteLine(c.x);
    Class1 d=c;//当然这句注释掉。传C过去也是一样的。
    gt(d);
    Console.WriteLine(c.x);
    }
    }
    这个例子说白了它引用的是同一个对像呀!因为D=C赋值的是C的引用呀!
    唉!你自已多看看这几个例题就应该能理解了。呵呵!我也不知道如何才能说清楚。
    可能表达能力太差吧!