欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#語(yǔ)法相比其它語(yǔ)言比較獨(dú)特的地方(二)

 更新時(shí)間:2015年04月10日 10:40:33   投稿:junjie  
這篇文章主要介紹了C#語(yǔ)法相比其它語(yǔ)言比較獨(dú)特的地方(二),本文講解了internal與protected、private、enum、string的==、傳引用等內(nèi)容,需要的朋友可以參考下

之前有個(gè)兄弟給我的卷一re了帖子,我當(dāng)時(shí)沒(méi)有g(shù),m,直到他把它刪掉才后悔莫及,人生最痛苦的事情莫過(guò)于此。。。。。。

好,即便如此,我們還是滿懷希望的向前奔去。接著寫(xiě)卷二。

還要提一下,上次最后說(shuō)到的delegate,在我了解了它的實(shí)現(xiàn)和用途以及看到我的偶像的一些訪問(wèn)記錄后,我對(duì)它有了很深的理解,并且在事件處理機(jī)制上,我更偏向于我偶像這邊,有兄弟說(shuō)MFC是switch,java是listener,其實(shí)java這些listener在processEvent里面還不是一個(gè)個(gè)switch然后調(diào)用,都是switch,那switch就不能說(shuō)是特點(diǎn)了,最大的特點(diǎn)還是是否直接使用函數(shù)指針來(lái)進(jìn)行響應(yīng)這點(diǎn)上。往下又說(shuō)信號(hào)處理,以前的8259A發(fā)生中斷查中斷向量表進(jìn)行到頭來(lái)也是地址轉(zhuǎn)移阿,這也沒(méi)特點(diǎn),到后來(lái)調(diào)用都是地址轉(zhuǎn)移,而速度的差別就在于在同樣不可避免具有某些相同層次實(shí)現(xiàn)的情況下,機(jī)制不同架構(gòu)不同造成的效率差別,這就完全取決于實(shí)力了。

1,internal與protected,private

C#默認(rèn)的,當(dāng)定義一個(gè)class的時(shí)候,如果你沒(méi)有加任何訪問(wèn)修飾子,那么該class的訪問(wèn)權(quán)限即為internal,當(dāng)然你可以顯式制定為internal。internal是什么呢?internal就是說(shuō)在當(dāng)前工程中,都可訪問(wèn),不管你自己用了幾個(gè)名稱空間,都無(wú)所謂。

但是在定義一個(gè)class中的成員變量的時(shí)候,假如你什么都不寫(xiě),那么這個(gè)成員變量默認(rèn)的權(quán)限就是private。如果你要這個(gè)成員在當(dāng)前工程中也可以被訪問(wèn),則必須使用internal關(guān)鍵字來(lái)顯式的修飾它。

另外,c#里面的protected訪問(wèn)權(quán)限仍然和以前的c++中是一致的含義,表示只有繼承者才有訪問(wèn)權(quán)限。即便是同一個(gè)工程,同一個(gè)名稱空間中的別的類,都別想看到這個(gè)protected成員,頗為嚴(yán)格的一個(gè)訪問(wèn)限制。

internal和protected基本控制訪問(wèn)是在不同的領(lǐng)域,他們兩個(gè)是可以同時(shí)用來(lái)修飾一個(gè)對(duì)象的。比如

復(fù)制代碼 代碼如下:

    class PPP
    {
        internal protected static int c=3;

    }


沒(méi)有交集,也不會(huì)互斥。

這跟java是截然不同的,其實(shí)我本可以完全不提java,但由于我自己的背景和一個(gè)通盤概括,我還是把java的拿出來(lái)與c#進(jìn)行類比。畢竟本文標(biāo)題是“特別之處”,當(dāng)然,這里我也不知道你會(huì)認(rèn)為是c#特別,還是java特別了。

java中沒(méi)有完全相同于這個(gè)internel似的訪問(wèn)控制,它有一種獨(dú)特的package訪問(wèn)控制。不管是類還是類的成員,如果你不寫(xiě)訪問(wèn)修飾,那么它就是package訪問(wèn)級(jí)別的,package訪問(wèn)級(jí)別的含義是在本package中都可以訪問(wèn)。java中沒(méi)有那種類似internal的“在本工程”或者本“jar”中可以訪問(wèn)的這種級(jí)別,只有package級(jí)別。
而java中的protected也是比c#中的protected要寬容得多,java中的protected的含義其實(shí)等價(jià)于c#中的protected并上java中的package。有人打了這么一個(gè)比方,說(shuō)大宅門,有很多資源都是protected的,這些資源不但可以造福四鄰(同在一個(gè)package中),還可以給自己的兒子阿,孫子阿(兒子孫子通過(guò)繼承得到資源)即便他們遠(yuǎn)走他鄉(xiāng)。

2,enum

我們學(xué)過(guò)C,C中定義enum中的元素符號(hào)的時(shí)候,這個(gè)符號(hào)不能夠與當(dāng)前作用域中的其他符號(hào)相同,并且,所有這些enum中的符號(hào)可以直接拿來(lái)當(dāng)常數(shù)使用,就好像是#define了一個(gè)整形常量一般。特別是當(dāng)不制定enum類型標(biāo)記的時(shí)候,那簡(jiǎn)直就是個(gè)#define。

C++中幾乎與C中相同,不同的是,當(dāng)定義一個(gè)這種enum對(duì)象的時(shí)候,不用
寫(xiě)  enum 類型標(biāo)記 對(duì)象;
而只用寫(xiě)  類型標(biāo)記 對(duì)象; 即可。

就好像以前必須寫(xiě) struct 類型標(biāo)記 對(duì)象;

而在c++中就可以只用寫(xiě)  類型標(biāo)記 對(duì)象;  一樣但是不管是在c#或者是java中,首先它們都不可以省略類型標(biāo)記。其次,不用確保必須不同于同個(gè)作用域的其他標(biāo)記符。再者,不可以直接把enum中的元素符號(hào)直接拿過(guò)來(lái)當(dāng)常量。起碼也要寫(xiě),類型標(biāo)記.元素符號(hào) 才行。
比如

復(fù)制代碼 代碼如下:

enum XXX{A,B,C,D}
....
Console.writeLine(XXX.A);

但是C#中又有其特別之處,它保留了部分c的enum才有的功能。那就是可以用運(yùn)算符+、-來(lái)對(duì)enum對(duì)象進(jìn)行運(yùn)算,這是java絕對(duì)做不到了,而且還可以轉(zhuǎn)換回int型別。比如
復(fù)制代碼 代碼如下:

enum weekdays{sunday,monday.....saturday}
for(weekdays wd=weekdays.sunday;wd<=weekdays.saturday;wd++)
   ...
(int)weekdays.sunday   //結(jié)果是0

也可以賦值
復(fù)制代碼 代碼如下:

enum open_modes{
  intput=1,output,append,
  last_input_mode=input,last_output_mode=output
}

如果你覺(jué)得默認(rèn)實(shí)現(xiàn)是int型太耗,可以用byte型
復(fù)制代碼 代碼如下:

enum weekdays:byte{
....
}

3.string的==
我們都知道Equals方法可以給人覆蓋用來(lái)判斷兩個(gè)對(duì)象是否是同值,而==作用于兩個(gè)對(duì)象只能比較兩個(gè)對(duì)象的ref是否相等。

我們?cè)趈ava中比較兩個(gè)字符串是否相等用的是"hello".equals(aaa);
但是在c#中,string對(duì)象的==運(yùn)算已經(jīng)被強(qiáng)行重寫(xiě),它就是表示equals,
這就是說(shuō),在c#中,實(shí)現(xiàn)字符串值比較的話,只需要寫(xiě)成"hello"==aaa就行了,
這樣設(shè)計(jì)的目的是為了更直觀。

4.傳引用

在java中有個(gè)非常經(jīng)典的問(wèn)題,這個(gè)問(wèn)題的到訪真是讓我習(xí)以為常。
那就是字符串處理函數(shù)的問(wèn)題。
在java或者c#中,有人

復(fù)制代碼 代碼如下:

void processString(String a)
{
    a=a+"asdfjsdf";
}

或者說(shuō)是數(shù)字交換問(wèn)題
復(fù)制代碼 代碼如下:

void processInt(int a,int b)
{
  int temp=a;
   a=b;b=temp;
}

前者還有說(shuō)的,后者則是連c的基礎(chǔ)都沒(méi)打好了,后者的話建議去補(bǔ)習(xí)C。
前者我來(lái)說(shuō)一下,不管是java中還是c#中,string對(duì)象都是immutable的,即一經(jīng)產(chǎn)生,就無(wú)法改變,那么+運(yùn)算符做了什么呢?它將生成一個(gè)新的string對(duì)象,然后把+兩邊的string的內(nèi)容都填進(jìn)來(lái)。

也就是說(shuō)a+"asdfdjkf"這個(gè)東西是一個(gè)全新的東西,如果寫(xiě)成a+="asdfj"或者a=a+"sdfjk"那么原來(lái)的a和這個(gè)"asdjf"就可以被GC了。

再說(shuō)java和c#中的對(duì)象型別,java和c#中所有的對(duì)象型別都是ref型別,也就是說(shuō)。

復(fù)制代碼 代碼如下:

String a;

這么一句話,只是定義了一個(gè)ref,它基本上不占用任何資源,也沒(méi)有生成任何真正的對(duì)象,它只是一個(gè)ref。

String a="dkfjsdf";的時(shí)候,在受控堆上生成一個(gè)對(duì)象"dkfjsdf",然后返回這個(gè)對(duì)象的ref給a。

我們?cè)倏磩偛拍莻€(gè)字符串處理,a只是一個(gè)類似局部變量的形式參數(shù),你將a的ref設(shè)為一個(gè)新值,然后函數(shù)返回,形式參數(shù)a沒(méi)了,原來(lái)的實(shí)際參數(shù)啥變化都沒(méi)有。

但是你說(shuō),我就是要這樣處理,這么辦呢?在java中,就沒(méi)法這樣處理String,不過(guò)StringBuffer之類的倒是可以,因?yàn)槲覀冸m然無(wú)法改變實(shí)際參數(shù)的ref值,但是卻可以通過(guò)相同值ref更改對(duì)象內(nèi)部成員,對(duì)于immutable的我們沒(méi)辦法,但對(duì)于mutable的我們就可以捏了。

而在c#中,非常恭喜你可以得逞了。就像我們剛才設(shè)想的那樣去處理string是可以的,不過(guò)要這樣做。

復(fù)制代碼 代碼如下:

void processString(ref string a)
{
  a+="sdjkf";
}

加上了ref,就取消了形式參數(shù)的產(chǎn)生和壓退棧,就好像c++中的string &了,相當(dāng)于是直接將實(shí)際參數(shù)交給你了。
這樣我們對(duì)它為所欲為都是可以的,這樣我們的processString就得逞了。
不過(guò)在填實(shí)際參數(shù)的時(shí)候,需要寫(xiě)成這樣
復(fù)制代碼 代碼如下:

string h="haha";
processString(ref h);
Console.WriteLine(h);

我們就可以看到h被改變了。

5,out參數(shù)

out參數(shù)就好像直接通過(guò)c#語(yǔ)言實(shí)現(xiàn)了com接口定義中的out的語(yǔ)義一樣。
就是輸出參數(shù),我們知道不管是windows api還是com,函數(shù)返回值通常用來(lái)處理異常的,而真正處理的結(jié)果是通過(guò)輸出參數(shù)帶回的,輸出參數(shù)實(shí)現(xiàn)有很多種方式,比如傳地址,傳引用,當(dāng)然com中從來(lái)不用c++中詭異的那個(gè)&引用。

out參數(shù)跟我們之前提到的ref參數(shù)唯一不同的就在于,ref參數(shù)在填到實(shí)參之前,必須初始化,而out參數(shù)無(wú)此要求,它就是用來(lái)帶回結(jié)果的,你可以定義一個(gè)未初始化的局部變量,然后用out 變量名的寫(xiě)法填進(jìn)去,調(diào)用完畢,值就放在這個(gè)變量里了。

比如我們改改剛才的processString來(lái)說(shuō)明out參數(shù)用法

復(fù)制代碼 代碼如下:

void processString( out string a)
{
   a="xxx";
}

string a;
processString(out a);
Console.WriteLine(a);

相關(guān)文章

  • WPF實(shí)現(xiàn)繪制3D圖形的示例代碼

    WPF實(shí)現(xiàn)繪制3D圖形的示例代碼

    WPF的3D功能可以在不編寫(xiě)任何c#代碼的情況下進(jìn)行繪制,只需要使用xaml即可完成3D圖形的渲染。本文主要講述了WPF-3D中的關(guān)鍵概念, 以及常用到的命中測(cè)試、2d控件如何在3D對(duì)象中進(jìn)行渲染,希望大家有所幫助
    2023-03-03
  • c#友好顯示日期 c#日期datetime使用方法

    c#友好顯示日期 c#日期datetime使用方法

    c# datetime根據(jù)日期顯示幾秒前、幾分前、幾天前、幾月前、幾年前等格式
    2014-01-01
  • C#獲取變更過(guò)的DataTable記錄的實(shí)現(xiàn)方法

    C#獲取變更過(guò)的DataTable記錄的實(shí)現(xiàn)方法

    這篇文章主要介紹了C#獲取變更過(guò)的DataTable記錄的實(shí)現(xiàn)方法,對(duì)初學(xué)者很有學(xué)習(xí)借鑒價(jià)值,需要的朋友可以參考下
    2014-08-08
  • C# Winform TextBox控件多行輸入方式

    C# Winform TextBox控件多行輸入方式

    這篇文章主要介紹了C# Winform TextBox控件多行輸入方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • C# 操作XML文檔 使用XmlDocument類方法

    C# 操作XML文檔 使用XmlDocument類方法

    對(duì)于很大的XML文檔,可以使用XmlReader類來(lái)讀取。因?yàn)閄mlReader使用Steam(流)來(lái)讀取文件,所以不會(huì)對(duì)內(nèi)存造成太大的消耗。下面就來(lái)看一下如何使用XmlDocument類,需要的朋友可以參考下
    2012-11-11
  • C#關(guān)鍵字之覆寫(xiě)overwrite介紹

    C#關(guān)鍵字之覆寫(xiě)overwrite介紹

    這篇文章介紹了C#關(guān)鍵字之覆寫(xiě)overwrite,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • 深入c# Func委托的詳解

    深入c# Func委托的詳解

    本篇文章是對(duì)c#中的Func委托進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • C#實(shí)現(xiàn)的AES加密解密完整實(shí)例

    C#實(shí)現(xiàn)的AES加密解密完整實(shí)例

    這篇文章主要介紹了C#實(shí)現(xiàn)的AES加密解密,結(jié)合完整實(shí)例形式分析了C#實(shí)現(xiàn)的AES算法進(jìn)行加密與解密的相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • 通過(guò)容器擴(kuò)展屬性IExtenderProvider實(shí)現(xiàn)WinForm通用數(shù)據(jù)驗(yàn)證組件

    通過(guò)容器擴(kuò)展屬性IExtenderProvider實(shí)現(xiàn)WinForm通用數(shù)據(jù)驗(yàn)證組件

    這篇文章介紹了通過(guò)容器擴(kuò)展屬性IExtenderProvider實(shí)現(xiàn)WinForm通用數(shù)據(jù)驗(yàn)證組件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 詳解.NET 6如何實(shí)現(xiàn)獲取當(dāng)前登錄用戶信息

    詳解.NET 6如何實(shí)現(xiàn)獲取當(dāng)前登錄用戶信息

    這篇文章主要介紹了.NET 6在應(yīng)用開(kāi)發(fā)時(shí)是如何實(shí)現(xiàn)當(dāng)前登陸用戶信息獲取的,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2022-01-01

最新評(píng)論