C#幾首易錯題

來源:互聯網
上載者:User

1.

 public class A
    {
        public virtual void Fun1(int i)
        {
            Console.WriteLine(i);
        }

        public void Fun2(A a)
        {
            a.Fun1(1);
            Fun1(5);
        }
    }

    public class B : A
    {
        public override void Fun1(int i)
        {
            base.Fun1(i + 1);
        }

        public static void Main()
        {
            B b = new B();
            A a = new A();
            a.Fun2(b);
            b.Fun2(a);
        }
    }

結果是:2,5,1,6

b.Fun2(a), 這裡直接調的是A類裡的Fun2, 第一個顯示1沒問題。

那麼Fun1(5),會直接調A的Fun1還是調B的Fun1呢? 等價this.Fun1(5), 大家看 b.Fun2(a), 那麼這個this應該指的是b. 會調b.Fun1(5),再調回A,所以是6.

 

2.

 class Class1
    {
        private string str = "Class1.str";
        private int i = 0;

        static void StringConvert(string str)
        {
            str = "string being converted.";
        }

        static void StringConvert(Class1 c)
        {
            c.str = "string being converted.";
        }

        static void Add(int i)
        {
            i++;
        }

        static void AddWithRef(ref int i)
        {
            i++;
        }

        static void Main()
        {
            int i1 = 10;
            int i2 = 20;
            string str = "str";
            Class1 c = new Class1();
            Add(i1);
            AddWithRef(ref i2);
            Add(c.i);
            StringConvert(str);
            StringConvert(c);
            Console.WriteLine(i1);
            Console.WriteLine(i2);
            Console.WriteLine(c.i);
            Console.WriteLine(str);
            Console.WriteLine(c.str);
        }
    }

這裡值得注意的是Console.WriteLine(str); 這句,大家也許會想string是參考型別,str傳進StringConvert而在裡面修改str的值,那應該會影響出來後的值。而實際上不然,為什麼呢? 

 因為string   對象稱為不可變的(唯讀),因為一旦建立了該對象,就不能修改該對象的值。有的時候看來似乎修改了,實際是string經過了特殊處理,每次改變值時都會建立一個新的string對象,變數會指向這個新的對象,而原來的還是指向原來的對象,所以不會改變。這也是string效率低下的原因。

結論:

String是參考型別,只是編譯器對其做了特殊處理。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.