当前位置:编程学习 > C#/ASP.NET >>

【C#】使用类作为其他类的属性,调用的时候有些问题让我不明白

把代码简单写一写

public class A
{
  public int key;//属性
}

public class B
{
  public A test;//属性
}

class Program
    {  static void Main(string[] args)
        {
           B b0=new B();
           b0.A=12;
           
           B b1=new B();
           B b2=b1;
           b1=b0.A;//执行完这一句,b1等于12,而且b2也等于
           
           A a1=new A();
           A a2=a1;
           a1=b0.A;//执行完这一句,a1等于12,但是a2没有变化
           
        }}
为什么会出现这样的情况,是不是类作为属性以后,有什么说法??
--------------------编程问答-------------------- int是值类型,A是引用类型。
B b0=new B();
  b0.A=12;? --------------------编程问答-------------------- 你这个代码都不能编译通过,错误的 --------------------编程问答-------------------- 一时心急写错了,不好意思  
是这样
class Program
  { static void Main(string[] args)
  {
  B b0=new B();
  b0.A.key=12;
    
  B b1=new B();
  B b2=b1;
  b1=b0;//执行完这一句,b1.A.key等于12,而且b2.A.key也等于12
    
  A a1=new A();
  A a2=a1;
  a1=b0.A;//执行完这一句,a1.key等于12,但是a2没有变化
    
  }}


--------------------编程问答-------------------- 这就是值类型他引用类型的区别
test(int)是值类型,A(class)是引用类型,
B b2=b1;
  b1=b0;
引用相同,同时改变,
--------------------编程问答-------------------- B b0=new B();
  b0.A.key=12;?这句话不抛异常吗?A没赋值 --------------------编程问答--------------------
引用 5 楼 mabaolin 的回复:
B b0=new B();
b0.A.key=12;?这句话不抛异常吗?A没赋值

我没在平台写这段程序,写这个我就想问问,为什么会出现刚才的a1和a2不同时改变的现象。 --------------------编程问答--------------------
引用 4 楼 ohkuy 的回复:
这就是值类型他引用类型的区别
test(int)是值类型,A(class)是引用类型,
B b2=b1;
  b1=b0;
引用相同,同时改变,

就是说,虽然test这个字段我定义成A(类这种引用类型),但是test他还是个值类型,是吗? --------------------编程问答-------------------- 向同时改变很简单:
public class B
{
  public static A test;//static 修饰,只有一个A的实例
}

很多时候全局类,即单个实例,都要可以封装在一个glbol类里,成为一个静态成员
这是我几年摸索出来的方法。
单个实例classA AA=classB.A

想多个实例,直接classA AA= new classA();


--------------------编程问答--------------------
引用 6 楼 kimiori2009 的回复:
引用 5 楼 mabaolin 的回复:
B b0=new B();
b0.A.key=12;?这句话不抛异常吗?A没赋值

我没在平台写这段程序,写这个我就想问问,为什么会出现刚才的a1和a2不同时改变的现象。

我这么问是因为如果A不赋值根本确定不了你的问题。不知道其他人是如何判断出来的。 --------------------编程问答--------------------  B b0 = new B();
            //b0.A = 12;
            b0.test = new A();
            b0.test.key = 12;

            B b1 = new B();
            B b2 = b1;
            b1 = b0;//执行完这一句,b1等于12,b2不等于

            A a1 = new A();
            A a2 = a1;
            a1 = b0.test;//执行完这一句,a1等于12,但是a2没有变化 --------------------编程问答-------------------- 呵呵 接分中

--------------------编程问答--------------------  B b0 = new B();
            //b0.A = 12;
            b0.test = new A();
            b0.test.key = 12;

            B b1 = new B();
            B b2 = b1;
            b1 = b0;//执行完这一句,b1等于12,而且b2不等于b1

            A a1 = new A();
            A a2 = a1;
            a1 = b0.test;//执行完这一句,a1等于12,但是a2没有变化 --------------------编程问答-------------------- 按照你的程序,b1.A.key等于12,而且b2.A.key也等于0的,b2.A.key并没有等于12 。同样,下面也不会改变。如果你想把值改变就把
 B b2=b1;
  b1=b0;

A a2=a1;
  a1=b0.A;这里调一下位置就会是一样的了 --------------------编程问答-------------------- 这样写不报错吗?
引用 7 楼 kimiori2009 的回复:
引用 4 楼 ohkuy 的回复:
这就是值类型他引用类型的区别
test(int)是值类型,A(class)是引用类型,
B b2=b1;
b1=b0;
引用相同,同时改变,

就是说,虽然test这个字段我定义成A(类这种引用类型),但是test他还是个值类型,是吗?
--------------------编程问答-------------------- 搞错了,是8楼的
引用 8 楼 zzz9413 的回复:
向同时改变很简单:
public class B
{
  public static A test;//static 修饰,只有一个A的实例
}

很多时候全局类,即单个实例,都要可以封装在一个glbol类里,成为一个静态成员
这是我几年摸索出来的方法。
单个实例classA AA=classB.A

想多个实例,直接classA AA= new classA();


……
--------------------编程问答-------------------- 类定义里怎么能直接写执行代码呢. --------------------编程问答-------------------- A a1=new A();
  A a2=a1;
  a1=b0.A;//执行完这一句,a1.key等于12,但是a2没有变化

a1和a2(地址1)
b0.a和a1(地址2)

 
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,