代码如下: class Program
{
static void Main(string[] args)
{
Animal a1 = new Animal("a1");
Animal a2 = new Animal("a2"); exchange(a1, a2);
Console.WriteLine("a1:" + a1.Name + "; a2:" + a2.Name); Console.Read();
} static void exchange(Animal a1, Animal a2)
{
Animal temp = new Animal();
temp = a1;
a1 = a2;
a2 = temp;
} } public class Animal
{
private string name; public string Name
{
get { return name; }
} public Animal(string n)
{
name = n;
} public Animal()
{ }
}既然Animal对象是引用类型,并且C#是按引用传递参数,为什么调用函数之后a1和a2对象的值并没有交换,而是保持不变?
{
static void Main(string[] args)
{
Animal a1 = new Animal("a1");
Animal a2 = new Animal("a2"); exchange(a1, a2);
Console.WriteLine("a1:" + a1.Name + "; a2:" + a2.Name); Console.Read();
} static void exchange(Animal a1, Animal a2)
{
Animal temp = new Animal();
temp = a1;
a1 = a2;
a2 = temp;
} } public class Animal
{
private string name; public string Name
{
get { return name; }
} public Animal(string n)
{
name = n;
} public Animal()
{ }
}既然Animal对象是引用类型,并且C#是按引用传递参数,为什么调用函数之后a1和a2对象的值并没有交换,而是保持不变?
解决方案 »
- 在C#程序中调用C++的dll,DllImport
- 在 System.IndexOutOfRangeException 中第一次偶然出现的“System.Data.dll”类型的异常
- c#引用动态库
- 将数据导出到word的问题
- 问DataTable.Select()到底返回一个什么样的数组..
- oledbconnection如何连接odbc数据源?
- 自行滚动进度条并显示进度如何实现
- vs2005 DataGridview 读取XML 文件问题 :提示无法创建字段 students 的子列表。
- ★★★★图片问题!急!!!★★★★
- 求助大家
- datagrideview获取当前列数的问题
- epss1000 C#开发谁会的?
帮忙看看啊
{
Animal temp = new Animal();
temp = a1;
a1 = a2;
a2 = temp;
}------------》
static void exchange(Animal a1, Animal a2)
{
Animal temp = a1.Clone();
a1 = a2.Clone();
a2 = temp.Clone();
}
public class Animal:ICloneable
{
private string name; public string Name
{
get { return name; }
} public Animal(string n)
{
name = n;
} public Animal()
{ }
public object Clone()
{
Animal ret = new Animal();
ret.Name = this.Name;
return ret;
}
}
{
static void Main(string[] args)
{
Animal a1 = new Animal("a1");
Animal a2 = new Animal("a2"); exchange(a1, a2);
Console.WriteLine("a1:" + a1.Name + "; a2:" + a2.Name); Console.Read();
} static void exchange(Animal a1, Animal a2)
{
string temp = a1.Name;
a1.Name = a2.Name;
a2.Name = temp;
}
}public class Animal
{
private string name; public string Name
{
get { return name; }
set { name = value; }
} public Animal(string n)
{
name = n;
} public Animal()
{}
}
//a1,a2指向调用处的2个对象
static void exchange(Animal a1, Animal a2)
{
Animal temp = new Animal();//不用实例化,多余
temp = a1;//temp指向a1的对象
a1 = a2;//a1这个形参(本函数内有效的一个引用类型变量,指向参数1的对象)指向a2的对象
a2 = temp;//a2指向temp的对象
//关键是a1,a2都是对象的引用。而不是引用的引用
}static void exchange(ref Animal a1, ref Animal a2)
这才是引用的引用。没看懂?仔细琢磨。
C#的引用和C++的引用有很大的区别。
C#的引用相当于指针,引用之间互相赋值只是地址的相互传递而不会影响到引用的内存中的对象。而C++则不同,对初始化的引用赋值相当于给实际被引用的对象赋值。
因此,以上temp = a1; a1 = a2; a2 = temp;这几句只是地址之间的相互赋值,并不会改变主函数中的对象。相应的如果是给a1的成员a1.Name赋值,则会修改实际对象的值。