国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

Top Ten Traps in C# for C++ Programmers中文版(轉)(2)

Top Ten Traps in C# for C++ Programmers中文版(轉)(2)

更新時間:2022-05-08 文章作者:未知 信息來源:網絡 閱讀次數:

陷阱六.虛方法必須被顯式重載

在C#中,如果程序員決定重載一個虛方法,他(她)必須顯式使用override關鍵字。

讓我們考察一下這樣做的好處。假定公司A寫了一個Window類,公司B購買了公司A的Window類的一個拷貝作為基類。公司B的程序員從中派生【譯注:原文為...using...,從下文來看,顯然是“派生”之意。事實上,使用類的方式還有“組合”(也有說為“嵌入”或“包容”(COM語義)等等),后者不存在下文所描述的問題】出ListBox類和RadioButton類。公司B的程序員不知道或不能控制Window類的設計,包括公司A將來對Window類可能做的修改。

現在假定公司B的程序員決定為ListBox類加入一個Sort方法:

public class ListBox : Window

{

public virtual void Sort() {}

}

這是沒有問題的—直到公司A的Window類作者發布了Window類的版本2,公司A的程序員向Window類也加入了一個public的Sort方法:

public class Window

{

public virtual void Sort() {}

}

在C++中,Window類新的虛方法Sort將會作為ListBox虛方法的基類方法。當你試圖調用Window的Sort時,實際上調用的是ListBox的Sort。C#中虛方法【譯注:原文寫成virtual function】永遠被認為是虛擬調度的根。這就是說,只要C#找到了一個虛方法,它就不會再沿著繼承層次進一步尋找了,如果一個新的Sort虛方法被引入Window,ListBox的運行時行為不會被改變。當ListBox再次被編譯時,編譯器會發出如下警告:

"\class1.cs(54,24): warning CS0114: 'ListBox.Sort()' hides inherited member 'Window.Sort()'.

如果要使當前成員重載實現,可加入override關鍵字。否則,加上new關鍵字。

如果想要移去這個警告,程序員必須明確指明他的意圖。可以將ListBox的Sort方法標為new,以指明它不是對Window的虛方法的重載:

public class ListBox : Window

{

public new virtual void Sort() {}

}

這樣編譯器就不會再警告。另一方面,如果程序員想重載Window的方法,只要顯式加上override關鍵字即可。

陷阱七:不可以在頭部進行初始化

C#里的初始化不同于C++。假定你有一個類Person,它有一個私有成員變量age;一個派生類Employee,它有一個私有成員變量salaryLeverl。在C++中,你可以在Employee構造器的成員初始化列表部分初始化salaryLevel:

Employee::Employee(int theAge, int theSalaryLevel):

Person(theAge) // 初始化基類

salaryLevel(theSalaryLevel) // 初始化成員變量

{

// 構造器體

}

在C#中,這個構造器是非法的。盡管你仍可以如此初始化基類,但對成員變量的初始化將導致一個編譯時錯誤。你可以在成員變量聲明處對其賦初始值:

Class Employee : public Person

{

// 在這兒聲明

private salaryLevel = 3; //初始化

}

【譯注:以上代碼有誤LC#中,正確寫法如下:

class Employee: Person

{

private int salaryLevel = 3;

}



你不需要在每一個類聲明的后面都加上一個分號。每一個成員都必須要有顯式的訪問級別聲明。

陷阱8.不能把布爾值轉換為整型值

在C#中,布爾值(true、false)不同于整型值。因此,不能這么寫:

if ( someFuncWhichReturnsAValue() )//【譯注:假定這個方法不返回布爾值】

也不能指望如果someFuncWhichReturnsAValue返回一個0它將等于false,否則為true。一個好消息是誤用賦值操作符而不是相等操作符的老毛病不會再犯了。因此,如果這么寫:

if ( x = 5 )

將會得到一個編譯時錯誤,因為x = 5的結果為5,而它不是布爾值。

【譯注:以下是C++里一不小心會犯的邏輯錯誤,編譯器不會有任何提示L運行得很順暢,不過結果并不是你想要的:

C++:

#include "stdafx.h"

int main(int argc, char* argv[])

{

int n = 0;

if (n = 1)//編譯器啥都沒說L一般推薦寫為1 == n,萬一寫成1 = n編譯器都不同意J

{

printf("1\n");

}

else

{

printf("0\n");

}

return 0;

}

以上運行結果為1,這未必是你想要的。

C#:

using System;

public class RyTestBoolApp

{

public static void Main()

{

int n = 0;

if (n = 1)//編譯器不同意J無法將int轉換成bool

{

Console.WriteLine("1");

}

else

{

Console.WriteLine("0");

}

}

}

但如果是這種情況:

bool b = false;

if (b = true)

...

不管是C++還是C#都沒招L



【譯注:C++程序員一般是喜歡這種自由的寫法:

if (MyRef)

if (MyInt)

但在C#里,必須寫成:

if (MyRef != null)//或if (null != MyRef)

if (MyInt != 0)//或if (0 != MyInt)

等。



陷阱九.switch語句不可“貫穿”【譯注:即fall through,Beta2的聯機文檔就是如此譯法】

在C#中,如果在case語句里有代碼的話,那它就不可“貫穿”到下一句。因此,盡管下面代碼在C++里合法,但在C#中則不然:

switch (i)

{

case 4:

CallFuncOne();

case 5: // 錯誤,不可以“貫穿”

CallSomeFunc();

}

為了達到這個目的,需要顯式地使用goto語句:

switch (i)

{

case 4:

CallFuncOne();

goto case 5;

case 5:

CallSomeFunc();

}

如果case語句沒做任何事(里面沒有代碼)就可以“貫穿”:

switch (i)

{

case 4: // 可以“貫穿”

case 5: // 可以“貫穿”

case 6:

CallSomeFunc();

}

【譯注:以下是使用switch的完整例子,它還說明了switch語句的參數類型可以是字符串,此例同時還演示了屬性的使用方法。

using System;

class RySwitchTest

{

public RySwitchTest(string AStr)

{

this.StrProperty = AStr;

}

protected string StrField;

public string StrProperty

{

get

{

return this.StrField;

}

set

{

this.StrField = value;

}

}

public void SwitchStrProperty()

{

switch (this.StrProperty)

{

case ("ry01"):

Console.WriteLine("ry01");

break;

case ("ry02"):

Console.WriteLine("ry02");

break;//如果這一行注釋掉,編譯器會報控制不能從一個case標簽(case "ry02":)貫穿到另一個標簽,如果你確實需要,可以這么寫:goto case ("ry03");或goto default。

case ("ry03"):

Console.WriteLine("ry03");

break;

default:

Console.WriteLine("default");

break;

}

}

}

class RySwitchTestApp

{

public static void Main()

{

RySwitchTest rst = new RySwitchTest("ry02");

rst.SwitchStrProperty();

}

}



陷阱十.C#需要明確的賦值操作

C#要求必須明確地進行賦值操作,這就意味所有變量在使用前必須被賦值。因此,盡管你可以聲明未初始化的變量,但在它擁有值之前是不可以被傳遞到方法的。

這就引出了一個問題—當你僅僅是想將變量用作一個“出”參數按引用傳遞給方法時。例如,假定有個方法,返回當前的小時、分鐘和秒。如果這么寫:

int theHour;

int theMinute;

int theSecond;

timeObject.GetTime( ref theHour, ref theMinute, ref theSecond)

編譯將出錯,因為在使用theHour、theMinute和theSecond前,它們沒有被初始化:

Use of unassigned local variable 'theHour'

Use of unassigned local variable 'theMinute'

Use of unassigned local variable 'theSecond'

可以將它們初始化為0或者其它什么無傷大雅的值以讓討厭的編譯器安靜下來:

int theHour = 0;

int theMinute = 0;

int theSecond = 0;

timeObject.GetTime( ref theHour, ref theMinute, ref theSecond)

但是這種寫法實在太愚蠢!我們的本意不過是想把這些變量按引用傳遞到GetTime,在其中改變它們的值。為了解決這個問題,C#提供了out參數修飾符。這個修飾符避免了對引用參數也要初始化的需求。例如,為GetTime提供的參數沒有提供給方法任何信息,它們僅僅是想從方法里取得信息。因此,把這三個參數都標記為out型的,就避免了在方法外初始化它們的需要。但當從被傳入的方法返回時,out參數必須被賦值。下面是改變后的GetTime參數聲明:

public void GetTime(out int h, out int m, out int s)

{

h = Hour;

m = Minute;

s = Second;

}

下面則是對GetTime方法的新的調用方式:

timeObject.GetTime( out theHour, out theMinute, out theSecond);

【譯注:完整示例如下:

C#:[例1:使用ref修飾的方法參數]

using System;

class RyRefTest

{

public RyRefTest()

{

this.IntField = 1;

this.StrField = "StrField";

}

protected int IntField;

protected string StrField;

public void GetFields(ref int AInt, ref string AStr)

{

AInt = this.IntField;

AStr = this.StrField;

}

}

class RyRefTestApp

{

public static void Main()

{

RyRefTest rrt = new RyRefTest();

int IntVar = 0;//如果是int IntVar; 編譯器會報使用了未賦值的變量IntVar

string StrVar = "0";//如果是string StrVar; 編譯器會報使用了未賦值的變量StrVar

rrt.GetFields(ref IntVar, ref StrVar);

Console.WriteLine("IntVar = {0}, StrVar = {1}", IntVar, StrVar);

}

}



C#:[例2:使用out修飾的方法參數]

using System;

class RyRefTest

{

public RyRefTest()

{

this.IntField = 1;

this.StrField = "StrField";

}

protected int IntField;

protected string StrField;

public void GetFields(out int AInt, out string AStr)

{

AInt = this.IntField;

AStr = this.StrField;

}

}

class RyRefTestApp

{

public static void Main()

{

RyRefTest rrt = new RyRefTest();

int IntVar;//這樣就可以了,如果寫成int IntVar = 0;當然也沒問題J

string StrVar; //這樣就可以了,如果寫成string StrVar = "0";當然也沒問題J

rrt.GetFields(out IntVar, out StrVar);

Console.WriteLine("IntVar = {0}, StrVar = {1}", IntVar, StrVar);

}

}

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        久久精品国产一区二区三 | 亚洲在线视频网站| 欧美一区二区大片| 欧美亚一区二区| 色呦呦一区二区三区| 国产在线播精品第三| 日韩电影在线一区二区| 一区二区三区国产| 亚洲一区二区三区在线看| 亚洲精品一二三| 一区二区三区免费网站| 亚洲午夜国产一区99re久久| 中文字幕制服丝袜一区二区三区 | 色欧美片视频在线观看在线视频| 国产成人av一区| 国产成人a级片| 国产成人自拍高清视频在线免费播放| 亚洲www啪成人一区二区麻豆| 一区二区三区不卡视频| 亚洲精品成人a在线观看| ...av二区三区久久精品| 国产精品久久影院| 亚洲三级久久久| 亚洲人成精品久久久久久| 中文字幕一区二区三区四区不卡 | 亚洲欧美日韩国产综合在线| 国产精品乱码妇女bbbb| 2019国产精品| 久久久精品国产免大香伊| 国产精品网站在线观看| 亚洲精品视频在线观看免费| 亚洲成人一区在线| 亚洲第一综合色| 欧美a一区二区| 国产成人亚洲精品青草天美| 国产成人免费在线观看| www.视频一区| 欧美日韩三级一区| 日韩视频国产视频| 亚洲国产高清不卡| 亚洲日本在线看| 秋霞av亚洲一区二区三| 国产在线视频精品一区| 成人白浆超碰人人人人| 91免费看`日韩一区二区| 欧洲精品视频在线观看| 欧美电视剧在线看免费| 精品国精品国产| 亚洲免费观看高清| 久久99精品久久久久久| 成人激情动漫在线观看| 欧洲亚洲国产日韩| 久久人人爽人人爽| 视频一区欧美精品| av日韩在线网站| 91精品国产欧美一区二区 | 久久婷婷成人综合色| 久久人人97超碰com| 亚洲美女在线一区| 国产综合久久久久久鬼色| 99国产欧美久久久精品| 精品国产精品一区二区夜夜嗨| 国产人伦精品一区二区| 偷拍亚洲欧洲综合| 成人黄色在线网站| 欧美一区二区三区免费大片 | 欧美精选在线播放| 日本一区二区三区在线观看| 亚洲夂夂婷婷色拍ww47| 国产成a人无v码亚洲福利| 69堂成人精品免费视频| 亚洲女爱视频在线| 国产精品一区二区视频| 91国偷自产一区二区三区成为亚洲经典| 2023国产精品自拍| 亚洲已满18点击进入久久| 国产成人aaa| 2021久久国产精品不只是精品| 亚洲一区二区三区在线看| 国产成人激情av| 精品粉嫩超白一线天av| 美国毛片一区二区| 91精品国产综合久久精品性色| 国产精品区一区二区三| 久久99这里只有精品| 日韩视频在线永久播放| 中文字幕一区二区三区在线播放 | 亚洲欧美激情视频在线观看一区二区三区 | 亚洲欧美影音先锋| 国产乱理伦片在线观看夜一区 | 久久久久国产精品麻豆ai换脸| 麻豆成人免费电影| 欧美午夜精品理论片a级按摩| 中文字幕在线观看不卡| www..com久久爱| 综合自拍亚洲综合图不卡区| 激情图片小说一区| 欧美成人aa大片| 精品午夜一区二区三区在线观看| 欧美日韩精品欧美日韩精品一综合| 亚洲在线成人精品| 欧美性大战久久久久久久 | 亚洲色图欧洲色图| 91黄色小视频| 日韩中文字幕1| 日韩一区二区三免费高清| 久久精品国产亚洲一区二区三区| 欧美草草影院在线视频| 丰满白嫩尤物一区二区| 亚洲乱码国产乱码精品精小说| 欧美亚洲高清一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 精品国产1区2区3区| 99久久婷婷国产综合精品| 亚洲午夜激情网站| 欧美一级艳片视频免费观看| 激情深爱一区二区| 中文字幕精品在线不卡| 欧美性极品少妇| 国产综合一区二区| 一区二区三区影院| 欧美影院一区二区三区| 蜜臀久久99精品久久久画质超高清| 日韩免费视频一区二区| 成人国产亚洲欧美成人综合网 | 经典三级在线一区| 国产精品乱码一区二三区小蝌蚪| 9i看片成人免费高清| 亚洲不卡在线观看| 中文字幕成人av| 91精品国产入口| 99久久精品情趣| 国产一区二区剧情av在线| 日本一区二区成人在线| 91蜜桃在线观看| 久久成人18免费观看| 亚洲欧美激情在线| 26uuu亚洲综合色| 在线视频国内自拍亚洲视频| 久久国产精品99精品国产| 亚洲乱码国产乱码精品精可以看| 日韩欧美三级在线| 欧洲视频一区二区| 成人在线视频一区二区| 久久精品久久99精品久久| 一区二区三区成人| 国产精品毛片久久久久久久| 日韩天堂在线观看| 欧美午夜免费电影| 成人国产电影网| 国内精品免费**视频| 日本三级韩国三级欧美三级| 夜夜精品视频一区二区| 国产精品色婷婷久久58| 久久久777精品电影网影网| 日韩一区二区三区观看| 欧美日本在线视频| 91精彩视频在线| 色一区在线观看| 成人av片在线观看| 久久狠狠亚洲综合| 亚洲成人免费影院| 亚洲综合一区在线| 亚洲男人天堂av| 国产精品久久久久永久免费观看 | 精品精品国产高清一毛片一天堂| 色老头久久综合| 91在线观看高清| av网站免费线看精品| 成人福利视频网站| 波波电影院一区二区三区| 国产91清纯白嫩初高中在线观看| 精品亚洲aⅴ乱码一区二区三区| 日本不卡一区二区三区高清视频| 午夜电影一区二区三区| 亚洲福利一区二区三区| 亚洲国产另类av| 亚洲高清免费一级二级三级| 亚洲专区一二三| 性久久久久久久久| 亚洲大片精品永久免费| 天堂精品中文字幕在线| 日韩av不卡在线观看| 看片的网站亚洲| 国产酒店精品激情| 成人涩涩免费视频| 99在线热播精品免费| 色香蕉久久蜜桃| 欧洲亚洲精品在线| 日韩一区二区三区视频在线观看 | 欧洲精品中文字幕| 欧美精品日韩一本| 精品国产乱码久久久久久浪潮| 久久久久99精品国产片| 亚洲视频一区在线观看| 亚洲成人av免费| 国产一区二区三区四区五区美女| 懂色av中文一区二区三区| 91精品91久久久中77777| 日韩1区2区日韩1区2区|