程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 全面理解C#中的重載運算符和轉換運算符

全面理解C#中的重載運算符和轉換運算符

編輯:.NET實例教程

關於重載運算符大家可能都很少用,也就對他不是很理解了。
大家很少用的原因其中一個是因為寫程序的時候都是用dataset datatable來保存數據,並沒有構建自己的數據類,這樣實現功能起來雖然很方便,但是靈活度就不夠了,一直就限制在線性表的操作。2005年以前我也是這樣做的,因為那時候我覺的dataset很方便,很好用,但是用久了就覺得,怎麼C#就是dataset datagrid 。直到深入的去看petshop的代碼,才理解了程序是什麼,什麼是架構。但是petshop是一個microsoft展示他C#的功能,所以有些功能對於實際開發並不太適用。

很多人會到論壇上問  ClassA + ClassB 為什麼會報錯,結構都一樣,為什麼會錯,microsoft怎麼那麼笨。
原因就在這裡了,你應該告訴C# 你要怎麼加,重載運算符就是告訴他,+ 法是這樣做地。。。下面是我寫的一個重載運算符+的一個例子 

 



public class MyClass
    ...{
        private int _x = 0;
        /**//// <summary>
        /// X屬性
        /// </summary>
        public int X
        ...{
            get ...{ return _x; }
            set ...{ _x = value; }
        }

        private int _y = 0;
    /**//// <summary>
        /// Y屬性
        /// </summary>
        public int Y
        ...{
            get ...{ return _y; }
            set ...{ _y = value; }
        }

        /**//// <summary>
        /// 重載+運算符號,讓兩個對象可以進行加操作
        /// </summary>
        /// <param name="A">加 對象</param>
        /// <param name="B">被加 對象</param>
   &nbsp;    /// <returns>結果對象</returns>
        public static MyClass Operator +(MyClass A, MyClass B)
        ...{
            MyClass resultClass = new MyClass();
            resultClass.X = A.X + B.X;
            resultClass.Y = A.Y + B.Y;
            return resultClass;
        }

    }

 

測試代碼

 



  MyClass classA = new MyClass(10, 20);
            MyClass classB = new MyClass(1,2);
            MyClass classC = classA + classB;


            MessageBox.Show(classC.X.ToString());

            MessageBox.Show(classC.Y.ToString());

我們可以得到11 和12 兩個結果,這樣就可以對自定義類進行加法運算了。需要注意的是 重載運算符的定義 基本可以用於單、雙目運算符,邏輯運算符不能重載(&&,||) 賦值運算符不能重載(+=,-=...)

public static MyClass operator + 的定義必須是static的,不能為其他定義.方法必須命名 Operator 符號

關於轉換運算符 是自定義類互相轉換時非常重要的的一個功能。打個不恰當的比方:一個類是男孩,一個類是男人,怎麼樣把男孩轉成男人呢。。。

轉換運算符的定義與重載運算符的定義相似,下面給出轉換運算符的例子,延用上面的MyClass在,再定義一個MyBestClass,建立轉換運算符 ,實現MyClass到MyBestClass的轉換

 



public class MyBestClass
    ...{
        private float _width;

        public float Width
    ...{
            get ...{ return _width; }
            set ...{ _width = value; }
        }


        private float _height;

        public float Height
        ...{
            get ...{ return _height; }
            set ...{ _height = value; }
        }

  /**//// <summary>
        /// 顯性轉換運算符
        /// </summary>
        /// <param name="ClassA"></param>
        /// <returns></returns>
        public static explicit Operator MyBestClass(MyClass ClassA)
        ...{
            MyBestClass BestClass = new MyBestClass();
            BestClass.Width = Convert.ToSingle(ClassA.X);
            BestClass.Height = Convert.ToSingle(ClassA.Y);
            return BestClass;
        }
    }

 

測試代碼如下



MyClass classA = new MyClass(10, 20);

            MyBestClass BestClass = (MyBestClass)classA;

            MessageBox.Show(BestClass.Width.ToString());
            MessageBox .Show (BestClass .Height .ToString ());

結果是10,20
static是必須的 ,Operator 名字也是固定的,可變只有explicit
explicit表示顯式轉換,如其意思一樣,操作的時候程序員明顯知道這個類被轉換了.
還有一個種是 隱式轉換 implicit
如果

 



public static explicit Operator MyBestClass(MyClass ClassA)改為

public static implicit Operator MyBestClass(MyClass ClassA)那麼

MyBestClass BestClass = (MyBestClass)classA;就可以改為

MyBestClass BestClass = classA;        //隱式轉換 感覺不到類被轉換了

實際運用來說,顯式運算符更有用,因為更明顯,可以讓程序員引起一定的關注。

上面就是我對重載運算符和轉換運算符的一些個人理解,如果偏差,大家不要砸我臭雞蛋,直接扔燒雞好了,希望對大家有點幫助

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved