我定义一个函数
void test(List<double> a)
{
a.Clear();
}
然后我在其他函数中调用这个函数。
例如
main()
{
    List<double> a=new List<double>();
    a.Add(1);
    Test(a);
}
为什么a被清空了

解决方案 »

  1.   

    你不是调用了a.Clear()吗...
    那a的元素不是被移除了吗...
      

  2.   

    但是a是参数啊
    Test中的a只是单单复制了main中的啊
    不一样的啊
      

  3.   

    void test(List<double> a) 

      // a 本身不能被修改,但 a 的内容可以被修改
      // 也就是说下二行的作用会被传回调用它的程序:
      a.Clear();
      a.Add(2);
      // 但下二行的作用对调用它的程序无影响:
      a = new List<double>();
      a.Add(3); 
      

  4.   

    class Sentence
        {
            public static Hashtable PREDICATE = new Hashtable();
            static string[] MeanWords = null;
            public string Content = "";
            public HashSet<int> KeywordsHashcode = new HashSet<int>();
            public int MaxHashcode = 100000;
            string Mean = "NO";
            public double Reliablity = 0;
            public double Similar(Sentence s)
            {
     //           return 0;
                int union = s.KeywordsHashcode.Count + KeywordsHashcode.Count;
                Sentence a = new Sentence();
                a = s;
                a.Content = s.Content;
                a.Content = "";
                a.KeywordsHashcode.IntersectWith(KeywordsHashcode);
                return a.KeywordsHashcode.Count / (union - a.KeywordsHashcode.Count);
            }
         }请问一下为什么在函数similar中 我新建了a a=s后修改a的内容  s的内容也跟着被修改了
      

  5.   

    您好 
    请问为什么如果不是List  而是int a作为参数
    即使在test里设置a=-1
    a在main中的值也不会被修改呢?
      

  6.   

    在 C++ 中可以将参数设置为 const,但在 C# 中似乎不行,但可以传递一个只读副本进去:static void Main()
    {
      // ...
      Test(a.AsReadOnly());
    }static void Test(IList<double> a) 

      // 运行时会抛出异常:System.NotSupportedException: 集合是只读的。
      a.Clear();
      

  7.   


    值类型的参数是不会被子程序修改的,除非加上 out 或 ref 修饰符。其实引用类型的参数也是不会被子程序修改的,除非加上 out 或 ref 修饰符,被修改的仅仅是引用的内容,看起来似乎是可以被修改。4楼已经解释过了,参数本身是不能被修改的,不管是值类型还是引类型。
      

  8.   

    HashSet<T>泛型类是.net 3.5的,我正在看,稍等。
      

  9.   

    谢谢您!
    我参数s中的hashset KeywordsHashcode本来有2个元素
    a=s
    后a的KeywordsHashcode也是两个元素
    a.KeywordsHashcode.IntersectWith(KeywordsHashcode); 
    是a和KeywordsHashcode取交集并且存储在a中,
    然后a的KeywordsHashcode中就只有一个元素了(交集大小为1)
    s和a一样KeywordsHashcode中只有一个元素了还有a.Content = ""; 
    后S.Content 也是""了(本来S.Content 不为"")
      

  10.   

    using System;class Sentence
    {
      public string Content;
    }class Program
    {
      static void Main()
      {
        Sentence s = new Sentence();
        s.Content = "abc";
        Console.WriteLine(s.Content);
        Sentence a = new Sentence();  // 这行的 new Sentence() 是多余的,因为下行把 a 指向了 s,则 a 原先的内容就是无主的了。
        a = s;                        // a = s 是引用复制,就是把 s 的地址传递给 a,此时 a 和 s 指向相同的内容。
        a.Content = "def";            // 因为 a 和 s 指向相同的内容,所以 s.Content 也改变为 "def" 
        Console.WriteLine(s.Content); // 输出 def
      }
    }
      

  11.   

                Sentence a = new Sentence(); 
                a = s; 可以改为:              Sentence a = s;a 直接指向 s,相当于 C++ 中的指针复制。注意引用类型和值类型的赋值是不一样的。
      

  12.   

    谢谢 看到您最新的回答。 
    有一点感到疑惑 
    如果我生命 
    class c 

    int m=0; 
    } c a1=new c(); 
    c a2=a1; 
    a2.m=3; 为什么这里a2.m被修改了 a1.m还是0呢?
      

  13.   

    a1.m 是3,不是0。using System;class c 

      public int m; 
    } class Program
    {
      static void Main()
      {
        c a1=new c(); 
        c a2=a1; 
        a2.m = 3; 
        Console.WriteLine(a1.m); // 输出 3
      }
    }
      

  14.   

    using System;class c 

      public int m;
      
      public c Clone()
      {
        return (c)this.MemberwiseClone();
      } 

    class Program
    {
      static void Main()
      {
        c a1 = new c();
        a1.m = 1; 
        Console.WriteLine(a1.m);   // 输出: 1    c a2 = a1.Clone();         // a2 和 a1 是不同的对象
        a2.m = 2;
        Console.WriteLine(a1.m);   // 输出: 1
        Console.WriteLine(a2.m);   // 输出: 2    c a3 = a1;                 // a3 和 a1 是同一个对象
        a3.m = 3; 
        Console.WriteLine(a1.m);   // 输出: 3
        Console.WriteLine(a3.m);   // 输出: 3
      }
    }