程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#語法比擬其它說話比擬奇特的處所(二)

C#語法比擬其它說話比擬奇特的處所(二)

編輯:C#入門知識

C#語法比擬其它說話比擬奇特的處所(二)。本站提示廣大學習愛好者:(C#語法比擬其它說話比擬奇特的處所(二))文章只能為提供參考,不一定能成為您想要的結果。以下是C#語法比擬其它說話比擬奇特的處所(二)正文


之前有個兄弟給我的卷一re了帖子,我其時沒有g,m,直到他把它刪失落才懊悔莫及,人生最苦楚的工作莫過於此。。。。。。

好,即使如斯,我們照樣滿懷願望的向前奔去。接著寫卷二。

還要提一下,前次最初說到的delegate,在我懂得了它的完成和用處和看到我的偶像的一些拜訪記載後,我對它有了很深的懂得,而且在事宜處置機制上,我更傾向於我偶像這邊,有兄弟說MFC是switch,java是listener,其實java這些listener在processEvent外面還不是一個個switch然後挪用,都是switch,那switch就不克不及說是特色了,最年夜的特色照樣能否直接應用函數指針來停止呼應這點上。往下又說旌旗燈號處置,之前的8259A產生中止查中止向量表停止到頭來也是地址轉移阿,這也沒特色,到後來挪用都是地址轉移,而速度的差異就在於在異樣弗成防止具有某些雷同條理完成的情形下,機制分歧架構分歧形成的效力差異,這就完整取決於實力了。

1,internal與protected,private

C#默許的,當界說一個class的時刻,假如你沒有加任何拜訪潤飾子,那末該class的拜訪權限即為internal,固然你可以顯式制訂為internal。internal是甚麼呢?internal就是說在以後工程中,都可拜訪,不論你本身用了幾個稱號空間,都無所謂。

然則在界說一個class中的成員變量的時刻,假設你甚麼都不寫,那末這個成員變量默許的權限就是private。假如你要這個成員在以後工程中也能夠被拜訪,則必需應用internal症結字來顯式的潤飾它。

別的,c#外面的protected拜訪權限依然和之前的c++中是分歧的寄義,表現只要繼續者才有拜訪權限。即使是統一個工程,統一個稱號空間中的其余類,都別想看到這個protected成員,很是嚴厲的一個拜訪限制。

internal和protected根本掌握拜訪是在分歧的范疇,他們兩個是可以同時用來潤飾一個對象的。好比

    class PPP
    {
        internal protected static int c=3;

    }

沒有交集,也不會互斥。

這跟java是判然不同的,其實我本可以完整不提java,但因為我本身的配景和一個全盤歸納綜合,我照樣把java的拿出來與c#停止類比。究竟本文題目是“特殊的地方”,固然,這裡我也不曉得你會以為是c#特殊,照樣java特殊了。

java中沒有完整雷同於這個internel似的拜訪掌握,它有一種奇特的package拜訪掌握。不論是類照樣類的成員,假如你不寫拜訪潤飾,那末它就是package拜訪級其余,package拜訪級其余寄義是在本package中都可以拜訪。java中沒有那品種似internal的“在本工程”或許本“jar”中可以拜訪的這類級別,只要package級別。
而java中的protected也是比c#中的protected要寬容很多,java中的protected的寄義其實等價於c#中的protected並上java中的package。有人打了這麼一個比喻,說年夜宅門,有許多資本都是protected的,這些資本不只可以造福四鄰(同在一個package中),還可以給本身的兒子阿,孫子阿(兒子孫子經由過程繼續獲得資本)即使他們遠走異域。

2,enum

我們學過C,C中界說enum中的元素符號的時刻,這個符號不克不及夠與以後感化域中的其他符號雷同,而且,一切這些enum中的符號可以直接拿來當常數應用,就似乎是#define了一個整形常量普通。特殊是當不制訂enum類型標志的時刻,那的確就是個#define。

C++中簡直與C中雷同,分歧的是,當界說一個這類enum對象的時刻,不消
寫  enum 類型標志 對象;
而只用寫  類型標志 對象; 便可。

就似乎之前必需寫 struct 類型標志 對象;

而在c++中便可以只用寫  類型標志 對象;  一樣然則不論是在c#或許是java中,起首它們都弗成以省略類型標志。其次,不消確保必需分歧於同個感化域的其他標志符。再者,弗成以直接把enum中的元素符號直接拿過去當常量。最少也要寫,類型標志.元素符號 才行。
好比

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

然則C#中又有其特殊的地方,它保存了部門c的enum才有的功效。那就是可以用運算符+、-來對enum對象停止運算,這是java相對做不到了,並且還可以轉換回int型別。好比

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

也能夠賦值

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

假如你認為默許完成是int型太耗,可以用byte型

enum weekdays:byte{
....
}

3.string的==
我們都曉得Equals辦法可以給人籠罩用來斷定兩個對象能否是同值,而==感化於兩個對象只能比擬兩個對象的ref能否相等。

我們在java中比擬兩個字符串能否相等用的是"hello".equals(aaa);
然則在c#中,string對象的==運算曾經被強行重寫,它就是表現equals,
這就是說,在c#中,完成字符串值比擬的話,只須要寫成"hello"==aaa就好了,
如許設計的目標是為了更直不雅。

4.傳援用

在java中有個異常經典的成績,這個成績的到訪真是讓我習認為常。
那就是字符串處置函數的成績。
在java或許c#中,有人

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

或許說是數字交流成績

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

前者還有說的,後者則是連c的基本都沒打好了,後者的話建議去補習C。
前者我來講一下,不論是java中照樣c#中,string對象都是immutable的,即一經發生,就沒法轉變,那末+運算符做了甚麼呢?它將生成一個新的string對象,然後把+雙方的string的內容都填出去。

也就是說a+"asdfdjkf"這個器械是一個全新的器械,假如寫成a+="asdfj"或許a=a+"sdfjk"那末本來的a和這個"asdjf"便可以被GC了。

再說java和c#中的對象型別,java和c#中一切的對象型別都是ref型別,也就是說。

String a;

這麼一句話,只是界說了一個ref,它根本上不占用任何資本,也沒有生成任何真實的對象,它只是一個ref。

String a="dkfjsdf";的時刻,在受控堆上生成一個對象"dkfjsdf",然後前往這個對象的ref給a。

我們再看適才誰人字符串處置,a只是一個相似部分變量的情勢參數,你將a的ref設為一個新值,然後函數前往,情勢參數a沒了,本來的現實參數啥變更都沒有。

然則你說,我就是要如許處置,這麼辦呢?在java中,就沒法如許處置String,不外StringBuffer之類的卻是可以,由於我們固然沒法轉變現實參數的ref值,然則卻可以經由過程雷同值ref更改對象外部成員,關於immutable的我們沒方法,但關於mutable的我們便可以捏了。

而在c#中,異常祝賀你可以未遂了。就像我們適才假想的那樣行止理string是可以的,不外要如許做。

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

加上了ref,就撤消了情勢參數的發生和壓退棧,就似乎c++中的string &了,相當因而直接將現實參數交給你了。
如許我們對它隨心所欲都是可以的,如許我們的processString就未遂了。
不外在填現實參數的時刻,須要寫成如許

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

我們便可以看到h被轉變了。

5,out參數

out參數就似乎直接經由過程c#說話完成了com接口界說中的out的語義一樣。
就是輸入參數,我們曉得不論是windows api照樣com,函數前往值平日用來處置異常的,而真正處置的成果是經由過程輸入參數帶回的,輸入參數完成有許多種方法,好比傳地址,傳援用,固然com中歷來不消c++中詭異的誰人&援用。

out參數跟我們之條件到的ref參數獨一分歧的就在於,ref參數在填到實參之前,必需初始化,而out參數無此請求,它就是用來帶回成果的,你可以界說一個未初始化的部分變量,然後用out 變量名的寫法填出來,挪用終了,值就放在這個變量裡了。

好比我們改改適才的processString來講明out參數用法

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

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

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