2、string b得到的是a值的副本不是a地址的副本。看看string class定义

解决方案 »

  1.   

    String 的实例被称为是“不可变的”,这是由于一旦创建它就无法修改它的值。看似能修改 String 的方法实际上只是返回一个包含修改内容的新 String。
      

  2.   

    override和new都是关键字,不像c++。在c#中进行virtual function覆盖或重载都需要加关键字。
      

  3.   

    1. 参见http://www.csdn.net/expert/topic/648/648417.xml?temp=.93479562. string在.NET里定义成了immutable的,就是一旦生成其值不可改变,Concat/Substring之类的函数都只会返回新建立的实例。对于一般程序而言,这样可以节省存储空间/提高处理效率。对于特殊应用,可以使用StringBuilder。3. string的确没有接受一个string的ctor,这是因为string不是普通的reference类型,而是primitive type, CLR由内建的指令支持。其copy和赋值是通过这些指令而不是string的函数调用完成的。4. 这个也太深入了吧?:)
    CLR会用一个内部结构保存类型信息,而每个类对象的实例都会有一个指向改结构的指针,这个指针是.NET对象的最小overhead(其实还有一个SyncBlockIndex,题外话)。5. C#编译器的简单翻译,比如:
      ArrayList oa;
      ...
      foreach(object o in oa) {
         ... 
      }
      等价与:
      IEnumerator ia = oa.GetEnumerator();
      while(true) {
         object o = ia.Current;
         ...
         if (ia.MoveNext() == null) break;
      }
      //一维数组的处理方法略有不同。 6. You are welcome. :)
      

  4.   

    String a = new String("123");应改为String a="123";
      

  5.   

    因为返回的是新的,所以String就像int一样要用ref,明白了~楼上~,是不是普通function要用new,而virtual要用override呢?好像virtual也可以new。
    new可以修改private, public的值,override不行。
    class A
    {
    public void test()
    {
    }
    }
    class B : A
    {
    public void test()
    {
    }
    }
    我不new会有warning,但是如果这样
    class A
    {
    public void test(int a)
    {
    }
    }
    class B : A
    {
    public void test(double a)
    {
    }
    }
    我不new就没有warning,有些糊涂!请指教~
      

  6.   

    qqchen79(知秋一叶) (  ) :你怎么知道这么多~,推荐两本书好么?~
      

  7.   

    new 表示隐藏。它以变量的声明为准。它不需要父类的方法使用virtual 关键字。
    override 表示重写。它以变量的实例化为准。它要求父类的方法使用virtual 关键字。例如:
    public class a
    {
      public void m1()
      {
        Console.WriteLine("THIS IS BASE a.m1")
      }
      public virtual void m2()
      {
        Console.WriteLine("THIS IS BASE a.m2")
       }
    }public class b:a
    {
       public new void m1()
       {
           Console.WriteLine("THIS IS CHILD b.m1") 
       }   public override void m2()
       {
           Console.WriteLine("THIS IS CHILD b.m2") 
       }
    }public static void Main(string[] args)
    {
       a  Oa1;     // 变量的声明
       b  Ob1;     // 变量的声明
       Oa1=new a();     // 变量的实例化
       Oa1.m1();        //  显示:THIS IS BASE a.m1
       Oa1.m2();        //  显示:THIS IS BASE a.m2
       Oa1=new b();     // 变量的实例化
       Oa1.m1();        //  显示:THIS IS BASE a.m1。这里是用new,所以它
                        //      以变量的声明为准,还是调用了父类a.m1()。
       Oa1.m2();        //  显示:THIS IS CHILD b.m2。这里是用override,
               //    所以它以变量的实例化为准,还是调用了子类b.m2()。
       Ob1=new b();     // 变量的实例化
       Ob1.m1();        //  显示:THIS IS CHILD b.m1。这里是用new,所以它
                        //      以变量的声明为准,还是调用了子类b.m1()。
    }foreach 是一种循环方式,就是在一堆东西里面对每个东西逐一进行处理。
      

  8.   

    to wuyong(WY) :
    请读
    http://www.csdn.net/expert/topic/648/648417.xml?temp=.9347956qqchen79(知秋一叶) 地解释好像和你得有些不一样哦~继续糊涂中,不过我觉得qqchen79(知秋一叶) 说得比较有道理~
      

  9.   


    1。new 是隐藏基类的方法, override是重写基类的方法——前提是基类中必须是虚拟或抽象的
    3。 String应该是个static类吧,不需要(允许)创建一个实例(即new)新手一个,不太懂,见笑
      

  10.   

    我已经给分!!各位收到没?csdn有bug!~
    如果各位没有收到,我删贴重给~
      

  11.   

    qqchen79(知秋一叶) 说的比我有水平。
    我只知其然, qqchen79(知秋一叶) 知其所以然。
    你按照他的思路去理解吧,这样对你更有益。
    分已收到,谢谢!