Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#类参数_C# - Fatal编程技术网

C#类参数

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

在上面的代码中,为什么实例“b”和“c”可以将值设置为实例“a”

在我看来,B类和C类都有自己的变量“a”,当我们称之为“B=new B(a);”或“C=new C(a);”时,应该在它们自己的字段中更改值,并且Main中的变量“a”会受到影响吗


但是,我错了。你能帮我了解一下结果吗?非常感谢。

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);