internal class Program { private static void Main(string[] args) { A a = new A { Name = "123", Length = 123 }; Console.WriteLine(a.Id); DoTest(a); Console.WriteLine(a.Id); Console.ReadLine(); } public static void DoTest(A a) { Console.WriteLine(a.Id); a.Id = Guid.NewGuid(); Console.WriteLine(a.Id); } } internal class A { public A() { Id = Guid.NewGuid(); } public Guid Id { get; set; } public string Name { get; set; } public int Length { get; set; } }
上面的代码在执行 DoTest的时候,传递进来的a是传递的指针吗?还是传递a对象的副本?
执行效果与下面代码完全相同:
internal class Program
{
private static void Main(string[] args)
{
A a = new A { Name = "123", Length = 123 };
Console.WriteLine(a.Id);
DoTest(ref a);
Console.WriteLine(a.Id);
Console.ReadLine();
}
public static void DoTest(ref A a)
{
Console.WriteLine(a.Id);
a.Id = Guid.NewGuid();
Console.WriteLine(a.Id);
}
}
internal class A
{
public A()
{
Id = Guid.NewGuid();
}
public Guid Id { get; set; }
public string Name { get; set; }
public int Length { get; set; }
}
上面的代码在执行 DoTest的时候,传递进来的a是传递的指针吗?还是传递a对象的副本?
c#中参数的传递都是值传递,如果你传递的是值类型,就是传递的值的副本,如果你传递的是引用类型,那传递的是这个对象的内存地址
如果如你所说,那么public static void DoTest(ref A a)传递过来的又是什么呢?
@RyanCheng: 那就是a本身,不是a指向的地址
@chenping2008 你的意思对引用类型作为参数传递时,如果加上ref 参数,那实际传递的是对象本身?我想.net应该不会把对象(对象可能会足够大)拿来直接操作吧.
引用
因为A是一个实体类.是一个引用类型,如果没有特殊定意的话.自定意的类都是引用类型的,像int,string,double...等等,是值类型的.
如果你搞不明白,建议你去看一下引用类型与值类型方面的资料.
@发粪图墙你就瞎捣蛋,问你这个了吗