我定义一个函数
void test(List<double> a)
{
a.Clear();
}
然后我在其他函数中调用这个函数。
例如
main()
{
List<double> a=new List<double>();
a.Add(1);
Test(a);
}
为什么a被清空了
void test(List<double> a)
{
a.Clear();
}
然后我在其他函数中调用这个函数。
例如
main()
{
List<double> a=new List<double>();
a.Add(1);
Test(a);
}
为什么a被清空了
那a的元素不是被移除了吗...
Test中的a只是单单复制了main中的啊
不一样的啊
{
// a 本身不能被修改,但 a 的内容可以被修改
// 也就是说下二行的作用会被传回调用它的程序:
a.Clear();
a.Add(2);
// 但下二行的作用对调用它的程序无影响:
a = new List<double>();
a.Add(3);
}
{
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的内容也跟着被修改了
请问为什么如果不是List 而是int a作为参数
即使在test里设置a=-1
a在main中的值也不会被修改呢?
{
// ...
Test(a.AsReadOnly());
}static void Test(IList<double> a)
{
// 运行时会抛出异常:System.NotSupportedException: 集合是只读的。
a.Clear();
}
值类型的参数是不会被子程序修改的,除非加上 out 或 ref 修饰符。其实引用类型的参数也是不会被子程序修改的,除非加上 out 或 ref 修饰符,被修改的仅仅是引用的内容,看起来似乎是可以被修改。4楼已经解释过了,参数本身是不能被修改的,不管是值类型还是引类型。
我参数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 不为"")
{
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
}
}
a = s; 可以改为: Sentence a = s;a 直接指向 s,相当于 C++ 中的指针复制。注意引用类型和值类型的赋值是不一样的。
有一点感到疑惑
如果我生命
class c
{
int m=0;
} c a1=new c();
c a2=a1;
a2.m=3; 为什么这里a2.m被修改了 a1.m还是0呢?
{
public int m;
} class Program
{
static void Main()
{
c a1=new c();
c a2=a1;
a2.m = 3;
Console.WriteLine(a1.m); // 输出 3
}
}
{
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
}
}