C#类参数
在上面的代码中,为什么实例“b”和“c”可以将值设置为实例“a” 在我看来,B类和C类都有自己的变量“a”,当我们称之为“B=new B(a);”或“C=new C(a);”时,应该在它们自己的字段中更改值,并且Main中的变量“a”会受到影响吗C#类参数,c#,C#,在上面的代码中,为什么实例“b”和“c”可以将值设置为实例“a” 在我看来,B类和C类都有自己的变量“a”,当我们称之为“B=new B(a);”或“C=new C(a);”时,应该在它们自己的字段中更改值,并且Main中的变量“a”会受到影响吗 但是,我错了。你能帮我了解一下结果吗?非常感谢。A是一种引用类型(此处为类),因此,如果您对A给出相同的引用,则从b或c更改其值将更改实例。您将类A的对象创建为- namespace ConsoleApplication3 { class P
但是,我错了。你能帮我了解一下结果吗?非常感谢。A是一种引用类型(此处为类),因此,如果您对A给出相同的引用,则从b或c更改其值将更改实例。您将类A的对象创建为-
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
A a = new A();
B b = new B(a);
C c = new C(a);
Console.WriteLine(a.intval + " " +a.strval);
Console.ReadLine();
}
}
class A
{
public int intval { get; set; }
public string strval { get; set; }
}
class B
{
public A _a;
public B(A a)
{
_a = a;
_a.intval += 100;
_a.strval += "From B;";
}
}
class C
{
A _a;
public C(A a)
{
_a = a;
_a.intval += 1000;
_a.strval += "From C;";
}
}
}
这意味着您已经分配了一个可以作为实例a
引用的内存块,现在您正在向类B和C传递相同的内存块地址(a
)
A a = new A();
这里的意思是,现在内存块
b
和内存块c
都指向同一内存块a
,因此实例b
或c
更改它将反映在分配给实例a
的同一内存块中的值,然后您尝试从实例a
获取该值,因此,您将通过B
和C更新值。您的类A
是一个引用类型,因此对A
对象的任何实例的任何更改都将在该对象的所有其他引用中共享
把你的变量想象成一个地方的地址,比如说,一个公园。创建引用类型的实例时,如下所示:
B b = new B(a);
C c = new C(a);
那就好比把公园的地址写在一张纸上。然后,当您指定另一个变量等于第一个变量时:
Foo a = new Foo();
这实质上是将地址复制到另一张纸上。现在有两张纸指向同一个地方(公园)
然后,如果有人用其中一张纸去公园,并以某种方式改变它(比如说,建造一个新的喷泉):
该更改将反映在所有现有对象上。或者用比喻的话来说,任何到这个地址去公园的人都会看到变化:
b.Bar = 5;
因此,当您在代码中执行您正在执行的操作时:
Console.WriteLine(a.Bar);
// Console Output: 5
因为A
是引用类型,A
、b.\u A
和c.\u A
都是对同一对象的引用。(它们都是不同的纸片,都在同一个公园有相同的地址。)当你理解变量是什么时,这一切都是有意义的。变量是值的占位符,这个值是什么
- 如果变量类型是引用类型,则存储的值
变量内部只是内存中
它当前指向的实例驻留
- 如果变量类型是值类型,那么存储在变量中的值就是实例本身
在您的例子中,a
的类型是引用类型(class
),因此这意味着存储在a
中的值就是newa()
所在的地址
由于默认情况下,参数是通过C#中的值传递的,因此当您执行new B(a)
或new C(a)
时,会生成a
中值的副本,即地址的副本。但是所有的地址,无论是原始的还是复制的,都指向同一个对象,这就是为什么您看到了您看到的行为。查看是否有帮助您在new B(a)
和new C(a)
中传递了a
的引用,因此B和C实际上使用了相同的实例:a=new a()代码>因为类是。类是引用类型而不是值type@Pikoh,谢谢你的链接,太棒了。谢谢大家,非常感谢你们的例子。它帮助我更好地理解这个概念。非常感谢。
Console.WriteLine(a.Bar);
// Console Output: 5
A a = new A();
B b = new B(a);
C c = new C(a);