精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入解析C#編程中的方法重載

開發 后端
方法重載是讓類以統一的方式處理不同類型數據的一種手段。在C#中,語法規定同一個類中兩個或兩個以上的方法可以用同一個名字,如果出現這種情況,那么該方法就被稱為重載方法.當一個重載方法被調用時,C#回根據調用該方法的參數自動調用具體的方法來執行.對于方法的使用者來講,這種技術是非常有用的。本文將對C#編程中的方法重載進行詳細介紹。

首先我們說一下什么是方法重載。在面對對象這樣的高級語言中都允許我們在一個類中定義多個方法名相同、方法間參數個數和參數順序不同的方法,對于參數個數不同或者參數列表不同的情況我們稱之為參數列表不同。需要注意的是這里沒有提到方法的返回值。也就是決定方法是否構成重載有以下幾個條件:

◆ 在同一個類中;

◆ 方法名相同;

◆ 參數列表不同。

例如下面的代碼:

public void Show()//(1)
        {
            Console.WriteLine("Nothing");
        }
        public void Show(int number)//(2)
        {
            Console.WriteLine(number);
        }
        /*
        public int Show(int number)//(3)
        {
            Console.WriteLine(number);
            return number % 5;
        }
        */

對于上面的代碼,(1)沒有參數,(2)使用了一個int類型的參數,(1)和(2)之間就構成了重載。(2)與(3)相比僅僅返回值不同,雖然重載不關心返回值的不同,但是在C#中不允許存在方法名和參數列表相同、返回值不同的方法,所以(2)和(3)不能同時存在于代碼中,(3)如果不注釋掉上面的代碼是沒有辦法通過編譯的。

上面我們僅僅討論了重載的一些基本常識,下面我們探討一下一些情況稍微復雜的重載情況。

首先我們看第一個版本:

using System;
using System.Collections.Generic;
using System.Text;
namespace OverrideDemo
{
    /// <summary>
    /// 說明:本實例用于講述重載的關系
    /// 作者:周公
    /// 日期:2008-09-04
    /// 首發地址:http://blog.csdn.net/zhoufoxcn
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            String s = null;
            Show(s);
            Object o = "123";
            Show(o);
        }
        static void Show(string s)
        {
            Console.WriteLine("String");
        }
        static void Show(Object o)
        {
            Console.WriteLine("Object");
        }
    }
}

大家猜猜這個程序的運行結果是什么?

以下是程序運行結果:

String
Object

對以上代碼進行分析,我們發現Show()方法有兩種形式,一種是string類型的參數,一種是object類型參數,在一個類中存在方法名相同、參數列表不同(參數個數或者參數類型不同)的現象我們稱之為overloading,即重載。不過這里的Show()方法的參數比較特殊,因為string類繼承于Object類,也就是Show()方法的參數存在一種繼承關系。從結果我們可以得出兩點結論:

(1)從String s = null;Show(s);最后調用的是static void Show(string s)這個方法我們可以得出,C#中方法調用是精確匹配的,也就是s是string類型,雖然string類型繼承自object類型,盡管static void Show(Object o)也滿足條件,但是方法聲明中static void Show(string s)這個聲明與s類型的最接近(因為s是string類型,與它最接近),所以執行static void Show(string s),而不執行static void Show(Object o)這個方法。

(2)從Object o = "123"; Show(o);最后調用的是static void Show(Object o)這個方法我們可以得出,C#中如果存在方法重載,會根據其refrence type(引用類型)來調用對象的方法,而不是根據instance type(實例類型)來調用。盡管”123”是string類型,但是它的refrence type是object類型的,所以會調用static void Show(Object o)這個方法而不是static void Show(string s)。

#p#

上面的Main()方法的IL代碼如下:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代碼大小       24 (0x18)
  .maxstack  1
  .locals init ([0] string s,
           [1] object o)
  IL_0000:  nop
  IL_0001:  ldnull
  IL_0002:  stloc.0
  IL_0003:  ldloc.0
  IL_0004:  call       void OverrideDemo.Program::Show(string)
  IL_0009:  nop
  IL_000a:  ldstr      "123"
  IL_000f:  stloc.1
  IL_0010:  ldloc.1
  IL_0011:  call       void OverrideDemo.Program::Show(object)
  IL_0016:  nop
  IL_0017:  ret
} // end of method Program::Main

從上面的IL代碼我們可以看出對于string s=null;這句代碼在IL中表示為:ldnull。

再根據上面的結論,我們看下面的代碼:

using System;
public class Program
{   public static void Main()
    {
    Show(null);
    Show("");
    Show(1);
    }
    static void Show(Object o)
    {
    Console.WriteLine("Object");
    }
   
    static void Show(String s)
    {
    Console.WriteLine("String");
    }
   
}

猜猜上面的代碼執行結果會是怎樣的?

以下是程序運行結果:

String
String
Object

從上面的運行結果我們可以得出以下結論:

(1)從Show(null)最后調用的是static void Show(String s)方法我們更進一步可以說在C#中是方法調用盡量精確匹配的。盡管null我們可以理解為一個空object對象或者一個空字符串,但是在這里C#還是精確為派生類。這就像我們沒有錢,可以說沒有一分錢也可以說沒有500英鎊,但是沒有一分錢自然就沒有500億英鎊,所以我們跟別人說沒有錢的時候沒有必要說沒有500億英鎊一樣。在這里自然null就表示空字符串。所以Show(null)這個方法會調用static void Show(String s)這個方法。

這有點像下面的情況:

一次活動大會上,主持人說:“身高不到1.60m的請坐在1到3排,身高不到1.75m的請做到4到6排,其他的請隨便坐。”

上面的語句似乎有些邏輯方面的問題,應該說身高超過1.60m但是不到1.75m的請坐到4到6排。但是如果你面對著一群拿著槍的強盜,他說上面的話時,恰好你也在場并且你的身高是1.55m,你會坐到哪一排?你總不可能冒著挨一槍的危險去糾正他的邏輯錯誤吧?最好的辦法是坐到1到3排。因為無論怎么說你的身高是絕對滿足不到1.60m這個條件的(盡管你的身高也滿足強盜說的第二個條件,即身高不到1.75米,但是你肯定不會冒這個危險,從上下句的意思我們也能推斷出人家的意思就是身高在1.61m到1.74m之間的人坐4到6排)。

在上面的代碼中,你在運行環境的眼中就是一個持槍的強盜,雖然null可以理解為null類型的string或者null類型的object,但是它不能向你問清楚這個到底是null類型的string或者null類型的object,因為string是Object的派生類,所以它按照null類型的string來調用相應的方法了。

(2)從Show("")最后調用static void Show(String s)這個方法進一步證明了方法調用是盡量選擇參數最匹配的那個執行。因為Show("")相當于:string s = ""; Show(s);s的引用類型是string,所以會調用static void Show(String s)這個方法。

#p#

我們在這里可以假設一下:假如存在一個類A是String類的派生類(實際上string類是sealed的,也就是不可繼承的,所以我說了是假設),并且存在在上面的代碼改變如下:

using System;
public class Program
{   public static void Main()
    {
    Show(null);
    Show("");
    }
    static void Show(Object o)
    {
    Console.WriteLine("Object");
    }
   
    static void Show(String s)
    {
    Console.WriteLine("String");
    }
    static void Show(A a)//假設A是String的派生類,當然實際上String類并沒有派生類,這里僅僅是假設
    {
    Console.WriteLine("A");
    }
   
}

如果上面的假設成立,上面的代碼運行結果應該如下:

A
String

(3)為什么Show(1)會調用static void Show(Object o)這個方法呢?在這個類中與Show(1)最精確的方法重載應該是static void Show(int i)這種方法聲明,但是方法中沒有,因為int是繼承自ValueType類,所以如果沒有static void Show(int i)這種聲明,那么其次接近的聲明應該是static void Show(ValueType v)這種聲明,可惜方法中依然沒有,不過ValueType類繼承自Object類,所以比static void Show(ValueType v)還次一點的方法重載聲明應該是static void Show(Object o),而類中也確實存在這種聲明,所以會調用static void Show(Object o)這個方法。當然從int到Object這個過程中存在一次box,也就是裝箱(裝箱是從值類型到引用類型的轉換),這個可以從下面的IL代碼可以看出來。

以下是第二種情況下Main()方法的IL代碼:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代碼大小       32 (0x20)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldnull
  IL_0002:  call       void OverrideDemo.Program::Show(string)
  IL_0007:  nop
  IL_0008:  ldstr      ""
  IL_000d:  call       void OverrideDemo.Program::Show(string)
  IL_0012:  nop
  IL_0013:  ldc.i4.1
  IL_0014:  box        [mscorlib]System.Int32
  IL_0019:  call       void OverrideDemo.Program::Show(object)
  IL_001e:  nop
  IL_001f:  ret
} // end of method Program::Main

下面我們對第二種情況的代碼做一些變化,代碼如下:

using System;
using System.Collections.Generic;
using System.Text;
namespace OverrideDemo
{
    /// <summary>
    /// 說明:本實例用于講述重載的關系
    /// 作者:周公
    /// 日期:2008-09-04
    /// 首發地址:http://blog.csdn.net/zhoufoxcn
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Show(null);
            Show(""); 
            Show(1);
        }
        static void Show(string s)
        {
            Console.WriteLine("String");
        }
        static void Show(Object o)
        {
            Console.WriteLine("Object");
        }
        static void Show(Program p)//Program是當前方法所在的類
        {
            Console.WriteLine("Program");
        }
    }
}

上面的代碼的運行結果是什么,你能猜出來嗎?

哈哈,上面的程序代碼是沒有運行結果的,因為它沒有辦法編譯!

為什么不能通過編譯呢?

原因就出在Show(null)這個方法這里!如果僅僅有static void Show(string s)和static void Show(Object o)方法構成重載關系,那么null我們既可以理解為空string引用也可以理解為空Object引用,因為string類型的限制更精確一些,所以C#會按照最精確地匹配成string類型,因而會執行static void Show(string s)這個方法。這是在前面的代碼中已經被證明的。可是現在多了一個static void Show(Program p)方法的重載,null既可以理解成空string類型引用,也可以理解成空Program類型引用,因為string類和Program類都是Object類的派生類,所以按照前面的推論自然不會當成空Object類型的引用。因為String類和Program類之間不存在繼承關系,按照最精確匹配原則,編譯器無法決定匹配成String類還是Program類最精確,所以編譯無法通過。

【編輯推薦】

  1. C#連接數據庫特殊方法兩則
  2. 深入理解C# 3.0的五項主要改進
  3. C#中的Namespace詳解
責任編輯:楊鵬飛 來源: zhoufoxcn的博客
相關推薦

2009-08-19 14:42:21

C#重載LoadPos

2009-08-12 10:56:47

C#運算符重載C#運算符重載實例

2009-08-25 17:15:50

C#隱藏C#重寫C#重載

2024-05-06 00:00:00

C#工具代碼

2009-08-31 18:17:32

C#接口編程

2024-05-11 07:13:33

C#Task編程

2024-06-25 08:33:48

2009-04-10 09:55:44

C#反射.NET

2024-06-24 08:36:54

2009-08-05 14:09:04

C#日期轉換

2024-05-15 08:09:23

2024-09-18 05:20:00

C#代碼

2009-07-31 16:00:30

C#函數重載

2009-03-27 09:26:20

定義Duck TypingC#

2024-05-06 00:00:00

ThreadPool線程調度

2009-08-21 09:44:44

C#發送Email郵件

2024-01-03 13:38:00

C++面向對象編程OOP

2009-09-01 11:19:47

C# 3.0擴展重載抉

2009-09-09 14:04:18

C# XML解析XML解析方法

2009-08-28 12:31:06

C#靜態方法
點贊
收藏

51CTO技術棧公眾號

91高清免费看| 天天干天天玩天天操| 天天av天天翘| 日韩高清不卡一区二区三区| 中文字幕日韩欧美在线| 亚欧美一区二区三区| 桃色av一区二区| 中文字幕精品一区| 国产精品12| 97人妻精品视频一区| 午夜国产一区| 亚洲欧美中文日韩在线| 五月天婷婷在线观看视频| 色戒汤唯在线| 亚洲色图欧美在线| 蜜桃av噜噜一区二区三| 国产女同91疯狂高潮互磨| 亚洲欧美日韩专区| 欧美精品在线视频观看| 精品国产aaa| 免费萌白酱国产一区二区三区| 欧美三级一区二区| 免费不卡av在线| 日本激情在线观看| 99久久婷婷国产综合精品| 91精品久久久久久久久久久久久久| 久久久久免费看| 91一区在线| 国产亚洲美女精品久久久| 91精品啪在线观看国产| 国产精品美女久久久久人| 欧美亚洲高清一区| www黄色日本| 国产蜜臀一区二区打屁股调教| 国产精品三级视频| 日本婷婷久久久久久久久一区二区| 黄色av免费观看| 国产老肥熟一区二区三区| 日韩免费视频在线观看| 性无码专区无码| 99精品福利视频| 久久久久久高潮国产精品视| 中文字幕五月天| 欧美三级三级| 国产亚洲精品成人av久久ww| 国产手机在线观看| 神马日本精品| 日韩麻豆第一页| 影音先锋人妻啪啪av资源网站| 9l视频自拍九色9l视频成人| 日韩精品中午字幕| 中文字幕无码毛片免费看| 国产乱码精品一区二区三区亚洲人 | 亚洲一区亚洲二区| 中文字幕乱码无码人妻系列蜜桃| 日韩高清在线观看| 国产精品久久久久久久美男 | 51精品秘密在线观看| 自拍偷拍21p| 四虎国产精品永久在线国在线 | 夜色激情一区二区| 男人c女人视频| 激情影院在线| 亚洲h动漫在线| 播放灌醉水嫩大学生国内精品| 欧美xxxhd| 在线一区二区三区| 天天干天天爽天天射| 91精品福利观看| 欧美一区二区高清| 男人操女人下面视频| 北条麻妃一区二区三区在线观看| 亚洲成人av资源网| 新91视频在线观看| 欧美国产一级| 欧美国产第一页| 欧美特黄aaaaaa| 美女高潮久久久| 91久久精品国产| 高清乱码毛片入口| 久久久久久亚洲综合| 亚洲欧洲免费无码| 亚洲婷婷噜噜| 欧美日韩中文字幕在线| 亚洲免费一级视频| 少妇精品在线| 亚洲欧美精品伊人久久| 欧美xxxooo| 亚洲人成毛片在线播放女女| 国产91亚洲精品| 国产男男gay体育生网站| 成人午夜视频网站| 色爱区成人综合网| 免费电影视频在线看| 色一区在线观看| 色姑娘综合天天| 亚洲人成网站77777在线观看| 在线视频国产日韩| 18精品爽视频在线观看| 日韩精品成人一区二区在线| 99久久精品免费看国产一区二区三区 | 日韩高清在线播放| 青春草免费在线视频| 色国产精品一区在线观看| 伊人色在线视频| 天堂av一区二区三区在线播放| 日韩专区在线播放| 日韩欧美三级视频| 极品少妇xxxx精品少妇偷拍| 久久久亚洲综合网站| 国产一二三区在线观看| 色婷婷久久久亚洲一区二区三区| 师生出轨h灌满了1v1| 欧美码中文字幕在线| 久久久久久久久91| 91超薄丝袜肉丝一区二区| 91浏览器在线视频| 国产传媒久久久| 精品九九久久| 亚洲免费小视频| 久久久久亚洲AV| 久草中文综合在线| 人偷久久久久久久偷女厕| 黄网站在线观| 精品日韩一区二区三区| 国产麻豆视频在线观看| 男女男精品网站| 久久九九视频| 国产美女高潮在线| 日韩精品一区二区三区三区免费| 很污很黄的网站| 青青草精品视频| 欧美日韩视频在线一区二区观看视频 | 国产香蕉精品| 欧美黑人xxx| 国产成人精品免费看视频| 中文字幕免费不卡| 欧美激情精品久久久久久小说| 秋霞影院一区二区三区| 亚洲**2019国产| 亚洲精品视频专区| 一区二区三区四区在线| 性生活在线视频| 影音先锋成人在线电影| 亚洲在线免费视频| 成人黄色在线电影| 91精品国产91热久久久做人人| 日本爱爱小视频| 精品一区二区三区免费观看| 在线免费一区| 国产一区二区三区亚洲综合| 久久成人在线视频| 国产后入清纯学生妹| 亚洲精品大片www| 日本泡妞xxxx免费视频软件| 黄色成人精品网站| 国产原创精品| 伊人久久av| 国产一区二区三区在线观看网站| 亚洲第一网站在线观看| 欧美激情综合五月色丁香| 艹b视频在线观看| 婷婷精品进入| 91嫩草视频在线观看| 波多一区二区| 日韩精品一区二区三区第95| 国产又粗又猛又黄视频| 国产精品久久久久久久浪潮网站 | 国产95亚洲| 欧美激情奇米色| 日本1级在线| 欧美午夜宅男影院| 国精品无码一区二区三区| 国产成人av电影在线观看| 国产91xxx| 国产成人ay| 成人在线视频网站| 国产福利在线免费观看| 亚洲奶大毛多的老太婆| 91国偷自产中文字幕久久| 亚洲综合色网站| 在线观看日韩精品视频| 美女久久久精品| 欧美高清中文字幕| 久操精品在线| 444亚洲人体| 在线观看网站免费入口在线观看国内 | 成人国产精品av| 91豆花视频在线播放| 国产一区二区激情| 99久久国产免费| 欧美午夜精品久久久久久久| 久久爱一区二区| 99久久er热在这里只有精品66| 天天插天天操天天射| 亚洲无线视频| 亚洲资源视频| 偷拍亚洲色图| 999国产在线| 日韩网站中文字幕| 欧美国产激情18| 一本一道波多野毛片中文在线| 欧美精品一区二区高清在线观看| 中文在线观看av| 午夜精品久久久久久久久久久| 夫妇交换中文字幕| 99热精品一区二区| 久久精品亚洲天堂| 久久综合九色| 国产一级爱c视频| 91精品国产成人观看| 欧美国产综合视频| 激情av综合| 91超碰rencao97精品| 99精品国自产在线| 欧美亚洲国产视频小说| 亚洲夜夜综合| 另类色图亚洲色图| av在线女优影院| 亚洲男女性事视频| 蜜桃av噜噜一区二区三区麻豆| 欧美日产国产精品| 日本熟女毛茸茸| 精品久久久久久中文字幕一区奶水| 人妻久久一区二区| 亚洲欧洲另类国产综合| 你懂得视频在线观看| 久久久av毛片精品| 中文人妻一区二区三区| 99免费精品视频| 欧美一级片在线免费观看| 国产真实乱对白精彩久久| 亚洲一级免费观看| 视频在线观看国产精品| 成人三级视频在线播放| 午夜在线一区二区| 黄色一级视频片| 日韩视频三区| 国产视频一视频二| 99在线观看免费视频精品观看| 国产av人人夜夜澡人人爽麻豆| 亚洲视频碰碰| 日韩亚洲欧美视频| 亚洲成色精品| 欧美 日韩 亚洲 一区| 亚洲乱亚洲高清| 伊人成色综合网| 在线亚洲欧美| 日韩 欧美 高清| 日韩专区欧美专区| 孩娇小videos精品| 精品一区二区三区久久| 男插女视频网站| 国产寡妇亲子伦一区二区| 欧美一区二区三区影院| 成人视屏免费看| 粉嫩av懂色av蜜臀av分享| 99久精品国产| 国产小视频自拍| 中文一区二区在线观看| 国产午夜精品理论片在线| 亚洲精品免费在线观看| 久久高清无码视频| 亚洲va国产天堂va久久en| 亚洲第一网站在线观看| 欧美日韩国产三级| 999国产精品视频免费| 欧美成人bangbros| 五月婷婷六月丁香| 国产亚洲欧洲高清一区| 黄色av网站在线播放| 欧美国产日韩一区| a一区二区三区| 国产精品欧美亚洲777777| 99国内精品久久久久| 国产精品日韩欧美一区二区三区| 牛牛影视久久网| 亚洲一卡二卡| 在线成人www免费观看视频| 欧美性大战久久久久xxx| 亚洲一区二区三区四区av| 超碰一区二区| 国产成人91久久精品| 日韩电影免费观看高清完整版在线观看| 91亚洲国产精品| 国产一区二区三区亚洲| 天堂va久久久噜噜噜久久va| 亚洲精品一二三区区别| 18岁网站在线观看| 极品少妇一区二区| 私密视频在线观看| 国产精品久久久久久久午夜片| 妺妺窝人体色www在线下载| 一本大道av伊人久久综合| av免费在线不卡| 亚洲欧美色婷婷| 亚洲区欧洲区| 国产精品久久久久久久久久久久久久 | 亚洲最大福利视频网| 精品在线91| 成人在线免费高清视频| 视频在线观看国产精品| av漫画在线观看| 中文字幕国产一区二区| 日韩欧美三级在线观看| 91精品国产综合久久福利软件| 欧美中文在线| 欧美激情亚洲综合一区| 久久久久久久性潮| 蜜桃精品久久久久久久免费影院| 一区二区国产在线| 免费激情视频在线观看| 99久久精品国产毛片| 老妇女50岁三级| 欧美三区在线观看| 男人的天堂在线| 国内精品模特av私拍在线观看 | 国产伦精品一区二区三区四区视频| 伊人久久大香线蕉综合网蜜芽| 成年在线观看视频| 免费一级片91| 无码一区二区三区在线| 午夜精品aaa| 亚洲精品久久久久avwww潮水| 久久精品国产99国产精品澳门| 欧美××××黑人××性爽| 精品国产综合久久| 韩国精品一区二区三区| 91香蕉视频免费看| 国产精品乱码一区二三区小蝌蚪| 成人免费毛片视频| 日韩毛片在线看| 日韩伦理在线| 精品视频一区二区三区四区| 亚洲国产日韩欧美一区二区三区| 无套白嫩进入乌克兰美女| 亚洲色图视频免费播放| 国产精品一区二区av白丝下载| 最新国产精品亚洲| 成人精品动漫| 亚洲精品中字| 久久99精品国产麻豆婷婷| 中文字幕第69页| 欧美日韩一区二区三区不卡| 91精品专区| 国产在线精品一区免费香蕉| 久久视频精品| 涩涩网站在线看| 国产精品国产三级国产aⅴ中文| 在线免费观看日韩视频| 日韩中文字在线| 日韩三级不卡| 蜜臀av色欲a片无码精品一区 | 国产精久久一区二区三区| 色呦呦日韩精品| 在线免费看黄网站| 91免费综合在线| 欧美日韩久久| 欧类av怡春院| 在线亚洲免费视频| 在线观看的av| 91原创国产| 国产午夜精品一区二区三区欧美| 丝袜美腿中文字幕| 欧美伊人精品成人久久综合97| 日本中文在线观看| av免费观看久久| 香蕉久久夜色精品| 欧美日韩生活片| 日韩小视频在线观看专区| 搞黄网站在线看| 日本午夜精品电影| 国产毛片精品国产一区二区三区| 日韩成人一区二区三区| 亚洲小视频在线观看| 亚洲成人高清| 日韩视频在线视频| 久久久九九九九| 97人妻精品一区二区三区软件 | 亚洲一区二区三区精品视频 | 99porn视频在线| 亚洲综合国产| 国产又粗又猛又爽又黄的视频小说| 欧美一区二区三区啪啪| 三级中文字幕在线观看| 一本一生久久a久久精品综合蜜| 国产成人免费av在线| 久久久精品毛片| 久久久久亚洲精品成人网小说| 国语产色综合| 三上悠亚 电影| 在线观看免费亚洲| 欧美色图天堂| 日韩女优中文字幕| 成人性生交大片免费看中文| 国产精品国产精品国产| 久久人91精品久久久久久不卡| 日韩大片在线观看| 中文字幕在线永久| 8x8x8国产精品|