節選自《C++、Java/C#之比較》http://dev.firnow.com/course/3_program/c++/cppsl/2008520/117228.html
使用指針,由程序員根據需要分配、訪問內存,程序運行時動作明確直接沒有額外的處理步驟,程序的執行效率就高,但若程序員忘了釋放內存或釋放內存的策略不夠周全,就會產生不可預知的問題,而且這種問題往往是比較嚴重。
不使用指針,并不意味著內存的分配、訪問與釋放不須處理,只不過是這些工作由編譯器生成的通用“內存管理器”完成了,因此程序執行時,必須增加額外的內存管理動作,所以執行效率相對上種方式而言有所下降。由于“內存管理器”的運作是基于業內專業人士制定的比較完善內存管理機制,因而安全程度較高。但實際上,由于內存的分配、訪問、使用、釋放的情況比較復雜,這種安全性并不是100%的。也就是說安全的保證是由“另外的人”負責的,這種情況下,一旦出現問題,你無法查清問題所在,或即使你查清問題所在,也無法糾正。
好了,關于指針,一邊是100%的效率、60%的安全性、100%的自由,一邊是60%的效率、99%的安全性、100%枷鎖,你選擇吧。我想對于“高手”而言,自信也罷、固執也罷,選擇指針是他們骨子里自由與冒險精神的決定。
“是生,是死——這是一個值得考慮的問題。”——但不要喪失了行動的能力。 下文引自《Java與C#的區別(語言級別)》http://wantsong.javaeye.com/blog/28769Java與C#的區別(語言級別)
可以到這里詳細了解Java與C#的區別,The C# Programming Language for Java Developers。 我將其整理了下,大致列在下面: 1. 源文件方面。C#可以在一個.cs 文件中。出現多個name sapce(命名空間,有些類似于pacakage),并定義多個類。C#包含有預處理指令。 2. 數據類型方面。 a) C#定義了struct(結構),不能是抽象的,也不能被繼承,是值類型的。 b) C#沒有基本類型的概念,全部是面向對象的類型,int是Int32的簡寫。 c) 在Java中const是保留字,final與C#中的const意思相同,C#中還有readonly允許運行時賦初值。 d) 字符串比較,C#中可以用=比較值,與Java一樣用StringBuffer來減少內存開銷。 3. 運算符方面。C#增加了Checked和Unchecked以繞過編譯錯誤。比如“把一個long付給int32 ,如果高32為零 則不會出錯,否則會有溢出錯誤,unchekced就是告訴編譯器不要去管溢出,盡你可能轉化” 4. 分支語句方面。在Java中goto是保留字。C#中switch中的case不會順序執行,末尾必須有break或者goto關鍵字。 5. 循環語句好像沒有什么不同的。 6. 訪問修飾符方面。在范圍放main,C#增加了internal和protected internal,前者表示只能從當前程序集內可見,即可以在編譯時可Assembly的DLL或EXE,類似于JAR;后者表示對當前程序集或者從此包含類繼承的類可見。Sealed相當于Java中的final關鍵字。 7. 方法方面。與Java相同,只有基本類型通過值傳遞,其他都是傳遞引用。不過C#也可以以引用的方式傳遞基本類型,利用ref關鍵字。而out關鍵字有些類似于Oracle存儲過程,與ref的區別在于:方法忽略out參數初始值,方法必須為out參數賦值。 8. 屬性方面。Getter和Setter的寫法不太一樣。 9. 繼承方面。C#增加了base關鍵字以指向父類。C#中父類方法中具有virtual關鍵字的才可以被子類重寫,重寫時還需要聲明override。與抽象類相同,abstract關鍵字也必須被override重寫。C#中的接口不能聲明常量,接口的屬性只是表示Getter或Setter。 10. 事件。Java中沒有(Java通過實現自定義偵聽器類執行事件)。C#定義了類似于函數指針的委托來實現事件。 11. 運算符重載。Java中無。運算符重載必須為類的靜態方法,重載==,其他判等操作也必許重載。 12. 異常方面。與Java非常相似,只是沒有throws關鍵字,無須截獲異常(當然要在程序主入口去截)。 13. C#增加了索引器,可以象訪問數組一樣訪問類或結構。個人感覺就是少些幾個字而已,還造成一定的困擾。 14. C#的Attribute要比Java的Annotation強很多。不過加上AOP后,這種動態功能Java也不錯了。 15. 在C#中也可以直接使用指針,開辟或者回收內存,只是要使用兩個關鍵字unsafe和fixed。引用自《c#,C++,Java比較》http://read.newbooks.com.cn/info/137063.html
1:純對象導向語言
C# 和 java 都是純對象導向語言,C++ 非純對象導向語言。2:強制型態檢查
C# 和 java 都強制進行型態檢查,C++ 則較寬松。3:宏
C# 和 java 都不支持宏,C++ 支持宏。4:Template
C# 和 java 都不支持 template,C++ 支持 template。5:多重繼承
C# 和 java 都不支持多重繼承,且都支持 interface,C++ 支持多重繼承。6:指針
C# 和 java 都不支持指針,C++ 支持指針。(不過,C# 允許在 unsafe code 內使用指針)7:內存管理
C# 和 java 都支持垃圾收集。C++ 不支持垃圾收集。8:虛擬機器
C# 和 java 都需要虛擬機器,C++ 不需要虛擬機器。Java 的執行檔是中間碼,叫做 bytecode,透過 java Runtime Environment(即 JRE)來執行;C# 的執行檔也是中間碼,叫做 managed code,透過 NGWS Runtime 來執行。除了 java,你也可以用其它程序語言(例如 Ada、Python)來作出 bytecode。除了 C#,你也可以用其它程序語言(例如 Visual Basic、C++)來作出 managed code。9:Namespace
C# 和 java 都支持階層式的 namespace,但 C++ 只支持單層的 namespace。Java 的 namespace 稱為 package,C# 的 namespace 就稱為 namespace。Java 和 C# 都使用「.」當作 namespace 的符號,而 C++ 使用「::」。10:Platform-Independent Type
C# 和 java 都使用 Platform-Independent Type,C++ 的 type 會受到平臺的影響。11:使用 Wrapper 包裝基本型態
C# 和 java 都支持將基本型態包裝成對象,在 java 叫做 wrapper,在 C# 則是叫做 box。12:boolean != integer
C# 和 java 都不允許把整數當布爾值用,C++ 則允許。13:access modifier
C# 和 java 都支持四種等級的 access modifier,包括 public、protected、private、default/internal;C++ 只支持 public、protected、private。Java 的 default(不寫)指的就是只針對同一個 package 開放,正好就是 C# 的 internal。14:變量初始化
C# 和 java 都規定不可使用未初始化的變量,C++ 則完全沒有這方面的限制。Java 和 C# 的編譯器都會主動幫未初始化的 field/data member 設定初始值,C++ 則不然。15:轉型
C# 和 java 都規定基本型態和 reference 型態不能互轉。16:數組邊界檢查
C# 和 java 都會主動進行數組邊界檢查,C++ 則不然17:呼叫 Native Code
C# 和 java 都支持呼叫 native code。Java 透過 JNI(Java Native Interface);C# 透過 PInvoke(Platform Invocation Service)18:Metadata
C# 和 java 的中間碼都包含有類別的 metadata,而 C 語言則是獨立在 header file。19:中間碼指令
C# 的 IL 中間碼指令和 java 的 bytecode 指令非常類似,有的甚至一樣。20:例外處理
C# 和 java 都支持 try/catch/finally,但 C++ 只支持 try/catch。 較細節,出處未知
c#與java的區別
1.屬性: java中定義和訪問均要用get和set方法,可以不成對出現。 c#中是真正的屬性,定義時get和set必須同時出現,房問時用.號即可。不用get,set
2.對象索引 就是對象數組 public Story this [int index]
3.C#中,不用任何范圍修飾符時,默認的是protect,因而不能在類外被訪問.
4.因為JAVA規定,在一個文件中只能有一個public類,而且這個類的名稱必須與文件名一模一樣,這是一個區別
5.在C#中,它是以Main方法來定位入口的.如果一個程序中沒有一個名為Main的方法,就會出"找不到入口的錯誤".不要把Main寫成main喲
6.C#預定義的簡單數據類型比Java多。例如,C#有unit,即無符號整數
7.忘掉Java中的static final修飾符。在C#中,常量可以用const關鍵詞聲明 C#的設計者還增加了readonly關鍵詞,readonly域只能通過初始化器或類的構造函數設置
8.公用類的入口點:c#是可以對Main進行重載(java中是main),允許有int返回值和空參數的Main
9.在Java中,switch語句只能處理整數。但C#中的switch語句不同,它還能夠處理字符變量。請考慮下面用switch語句處理字符串變量的C#代碼
10.C#沒有>>>移位操作符
11.goto關鍵詞: Java不用goto關鍵詞。在C#中,goto允許你轉到指定的標簽。不過,C#以特別謹慎的態度對待goto,比如它不允許goto轉入到語句塊的內部。在Java中,你可以用帶標簽的語句加上break或continue取代C#中的goto。
12.int[] x = { 0, 1, 2, 3 }; int x[] = { 0, 1, 2, 3 }; 但在C#中,只有第一行代碼合法,[]不能放到變量名字之后。
13.與Java不同的是,C#允許為名稱空間或者名稱空間中的類指定別名: using TheConsole = System.Console;
14.在Java中,包的名字同時也是實際存在的實體,它決定了放置.java文件的目錄結構。在C#中,物理的包和邏輯的名稱之間是完全分離的 .NET中包的實體稱為程序集(Assembly)。每一個程序集包含一個manifest結構。manifest列舉程序集所包含的文件,控制哪些類型和資源被顯露到程序集之外,并把對這些類型和資源的引用映射到包含這些類型與資源的文件。程序集是自包含的,一個程序集可以放置到單一的文件之內,也可以分割成多個文件。.NET的這種封裝機制解決了DLL文件所面臨的問題,即臭名昭著的DLL Hell問題。
15.在Java中,java.lang包是默認的包,C#中不存在默認的包
16.C#中的訪問修飾符與Java中的基本對應,但多出了一個internal。簡而言之,C#有5種類型的可訪問性,如下所示: public:成員可以從任何代碼訪問。 protected:成員只能從派生類訪問。 internal:成員只能從同一程序集的內部訪問。 protected internal:成員只能從同一程序集內的派生類訪問。 private:成員只能在當前類的內部訪問。
17.由于C#中不存在final關鍵詞,如果想要某個類不再被派生,你可以使用sealed關鍵詞
18.與Java不同,C#中的接口不能包含域(Field)。 另外還要注意,在C#中,接口內的所有方法默認都是公用方法。在Java中,方法聲明可以帶有public修飾符(即使這并非必要),但在C#中,顯式為接口的方法指定public修飾符是非法的。例如,下面的C#接口將產生一個編譯錯誤。
19.C#中的is操作符與Java中的instanceof操作符一樣,兩者都可以用來測試某個對象的實例是否屬于特定的類型。在Java中沒有與C#中的as操作符等價的操作符。as操作符與is操作符非常相似,但它更富有“進取心”:如果類型正確的話,as操作符會嘗試把被測試的對象引用轉換成目標類型;否則,它把變量引用設置成null。
20.C#仍舊保留了C++的內存手工管理方法,它適合在速度極端重要的場合使用,而在Java中這是不允許的
21.在C#中,所有的異常都從一個名為Exception的類派生
22.枚舉器即enum類型(java無),把它作為一個變量值的類型使用,從而把變量可能的取值范圍限制為枚舉器中出現的值。
23.結構(Struct)與類很相似,而結構是一種值類型,它存儲在棧中或者是嵌入式的,結構可以實現接口,可以象類一樣擁有成員,但結構不支持繼承
24.屬性聲明語法的第一部分與域聲明很相似,第二部分包括一個set過程和/或一個get過程
25.傳值方式: 在java中簡單數據類型的值傳參時,都以傳值方式; 在c#中如果加ref則會以引用的方式傳值(方法內部改變該參數,則外部變量一起跟著變); 加out與ref基本相同,但out不要求參數一定要初始化.
26.c#保留了指針。unsafe
27.代理:代理(delegate)可以看作C++或者其他語言中的函數指針 代理用來封裝可調用方法。你可以在類里面編寫方法并在該方法上創建代理,此后這個代理就可以被傳遞到第二個方法。這樣,第二個方法就可以調用第一個方法。 代理是從公共基類System.Delegate派生的引用類型。定義和使用代理包括三個步驟:聲明,創建實例,調用。代理用delegate聲明語法聲明。更細致的
C#與JAVA之比較(作者Yesky)
C#、Java之比較 很多人說C#是微軟用來和Java抗衡的武器,因為二者在很大程度上有著驚人的相似
,盡管如此,兩者不同的地方也很多,所謂“于細微處見差異”。那么兩者的相似和區
別都在什么地方呢?我們從今天開始,會從各個角度來對比C#和Java的特點,希望能對
正在學習、使用C#的朋友有所幫助。
1、C#和.NET平臺的概貌 2000年6月,微軟發布C#語言和.NET平臺。C#語言是一種強類型的,面向對象的語言
,它具有語法簡單、表達力強的特點,而.NET平臺則是構成微軟的“.NET計劃”的基石
。 .NET平臺的核心包括兩方面,一方面就是著名的通用語言運行機(Common Language
Runtime),雖然這個名詞起得晦澀了點,不過大家可以拿它和Java的虛擬機來作比較,
二者完成的任務大致相同;另一方面就是一大堆通用函數庫,這些庫函數可以被多種語
言調用,并且通過編譯都產生一種共同的中間語言(Intermediate Language),這種語
言也可以拿Java的字節碼來類比,雖然完成的方式有些不一樣。
2、C#和Java 下面簡單地把C#和Java的相似處列出來,雖然在這里我們重點討論的是C#和Java的
不同點,但是了解一下二者的相同之處也是很有必要的。 二者都編譯成跨平臺的、跨語言的代碼,并且代碼只能在一個受控制的環境中運行 自動回收垃圾內存,并且消除了指針(在C#中可以使用指針,不過必須注明unsafe
關鍵字) 都不需要頭文件,所有的代碼都被“包(package)”限制在某個范圍內,并且因為沒
有頭文件,所以消除了類定義的循環依賴 所有的類都是從對象派生出來,并且必須使用New關鍵字分配內存 用對象加鎖的方式來支持多線程 都具有接口(interface)的概念
內部類 繼承類的時候不會以某種特定的訪問權限來繼承; 沒有全局函數或者常量,一切必須屬于類; 數組或者字符串都自帶長度計算和邊界檢查; 只使用“.”操作符,沒有“->”和“::”; “null”、“boolean”和“bool”成為了關鍵字; 任何變量均在使用前進行初始化; 不能使用整數來返回到if條件語句中,必須使用布爾值; “Try”模塊后可以有“finally” ;3. 屬性(Property) 屬性的概念對大家來說應該是很熟悉的,類成員函數可以自由地訪問本類中的任何
屬性成員。不過若要從一個類中去訪問另一個類中的屬性,那就比較麻煩了,所以很多
時候我們使用Getxxx和Setxxx方法,這樣看起來顯得極不自然,比如用Java或者C++,代
碼是這樣的: foo.setSize (getSize () + 1); label.getFont().setBold (true); 但是,在C#中,這樣的方法被“屬性化”了。同樣的代碼,在C#就變成了: foo.size++; label.font.bold = true; 可以看出來,C#顯然更容易閱讀和理解。我們從這個“屬性方法”的子程序代碼中
,也可以看到類似情況:
Java/C++:
public int getSize()
{ return size;
}
public void setSize (int value)
{ size = value;
}
C#:
public int Size
{ get{return size;} set{size = value;}
} 為了區分這種屬性化的方法和類的屬性成員,在C#中把屬性成員稱作“域(field)”
,而“屬性”則成為這種“屬性化的方法”專用的名詞。順便說一句,其實這樣的屬性
化方法在VB和DELPHI中是經常碰到的,在VB中它也就叫屬性。 另外,在C#中Get和Set必須成對出現,一種屬性不能只有Get而沒有Set(在Java和
C++中就可以只有Get或者只有Set),C#中這樣做的好處在于便于維護,假如要對某種屬
性進行修改,就會同時注意Get和Set方法,同時修改,不會改了這個忘了那個。
4、對象索引機制(Indexer) C#中引入了對象索引機制。說得明白點,對象索引其實就是對象數組。這里和上一
節中的屬性聯系起來講一下,屬性需要隱藏Get和Set方法,而在索引機制中,各個對象
的Get或者Set方法是暴露出來的。比如下面的例子就比較清楚地說明了這一點。
public class Skyscraper
{ Story[] stories; public Story this [int index] { get { return stories [index]; } set { if (value != null) { stories [index] = value; } } } }5. 指代(Delegate) 指代這個玩意很特別,它有點象指針,但又不完全是,不過大家還是可以把它理解
為一種類型安全的、面向對象的指針。(什么是類型安全和面向對象就不用講了吧?)
順便提一句,有很多書上把Delegate翻譯成代理,我覺得這樣翻不夠確切,翻譯成“指
代”更恰當些,道理上吻合,并且還符合它的本來意思——微軟本來就是用Delegate來
“取代指針”,所以叫“指代”,呵呵。 說起指代,也許至今Sun還會對它憤憤不已,為什么呢?因為在Sun的標準Java中是
沒有這個東西的,它是微軟99年發布的MSVJ++6添加的“新特性”。為此,兩家公司吵得
不亦樂乎,并且還專門在網上寫了大量文章互相攻擊,有興趣的朋友可以去看看(只有
英文版)。
http://www.Javasoft.com/docs/white/delegates.html
http://msdn.microsoft.com/visualj/technical/articles/delegates/truth.asp 話歸正傳,指代有什么特點呢?一個明顯的特點就是它具有了指針的行為,就好象
從Java又倒回到了C++。在C#中,指代完成的功能大概和C++里面的指針,以及Java中的
接口相當。但是,指代比起C++的“正宗指針”來又要高明一些,因為它可以同時擁有多
個方法,相當于C++里面的指針能同時指向多個函數,并且是類型安全的,這一點體現了
它的“對象”特性;而比起Java的接口來,指代高明的地方在于它能可以不經過內部類
就調用函數,或者用少量代碼就能調用多種函數,這一點體現了它的“指針”特性。呵
呵,很有“波粒二象性”的味道吧?指代最重要的應用在于對于事件的處理,下一節我
們將重點介紹。6、事件(Event) C#對事件是直接支持的(這個特點也是MSVJ所具有的)。當前很多主流程序語言處
理事件的方式各不相同,Delphi采用的是函數指針(這在Delphi中的術語是“closure”
)、Java用改編類來實現、VC用WindowsAPI的消息系統,而C#則直接使用delegate和ev
ent關鍵字來解決這個問題。下面讓我們來看一個例子,例子中會給大家舉出聲明、調用
和處理事件的全過程。
//首先是指代的聲明,它定義了喚醒某個函數的事件信號
public delegate void ScoreChangeEventHandler (int newScore, ref bool cancel)
;
//定義一個產生事件的類
public class Game
{ // 注意這里使用了event關鍵字 public event ScoreChangeEventHandler ScoreChange; int score; // Score 屬性 public int Score { get { return score; } set { if (score != value) { bool cancel = false; ScoreChange (value, ref cancel); if (! cancel) score = value; } }
}
// 處理事件的類
public class Referee
{ public Referee (Game game) { // 裁判負責調整比賽中的分數變化 game.ScoreChange += new ScoreChangeEventHandler (game_ScoreChange); } // 注意這里的函數是怎樣和ScoreChangeEventHandler的信號對上號的 private void game_ScoreChange (int newScore, ref bool cancel) { if (newScore < 100) System.Console.WriteLine ("Good Score"); else { cancel = true; System.Console.WriteLine ("No Score can be that high!"); } }
}
// 主函數類,用于測試上述特性
public class GameTest
{ public static void Main () { Game game = new Game (); Referee referee = new Referee (game); game.Score = 70; game.Score = 110; }
} 在主函數中,我們創建了一個game對象和一個裁判對象,然后我們通過改變比賽分
數,來觀察裁判對此會有什么響應。 請注意,我們的這個系統中,Game對象是感覺不到裁判對象的存在的,Game對象在
這里只負責產生事件,至于有誰會來傾聽這個事件,并為之作出反應,Game對象是不作
任何表態的。 我們注意到,在裁判類的Referee函數中,Game.ScoreChange后面使用了+=和-=操作
符,這是什么意思呢?回到我們定義ScoreChange的地方,可以發現ScoreChange是用ev
ent關鍵字修飾的,那么這里的意思就很明白了:ScoreChange是一個事件,而事件被觸
發后需要相應的事件處理機制,+=/-=就是為這個事件增加/移除相對應的事件處理程序
,而且,并不是一個事件只能對應一個處理程序,我們還可以用這兩個操作符為同一事
件增加/移除數個事件處理程序。怎么樣?很方便吧! 在實際應用中,和我們上面講的(競賽-裁判)機制很相近的系統就是圖形用戶界面
系統了。Game對象可以看作是圖形界面上的小零件,而得分事件就相當于用戶輸入事件
,而裁判就相當于相應的應用程序,用于處理用戶輸入。 指代機制的首次亮相是在MSVJ里,它是由Anders Hejlsberg發明的,現在又用到了
C#中。指代用在Java語言中的后果,則直接導致了微軟和Sun之間對類和指針的關系產生
了大量的爭論和探討。有意思的是,Java的發明者James Gosling非常幽默地稱呼指代的
發明者Anders Hejlsberg為“‘函數指針’先生”,因為Anders Hejlsberg總是想方設
法地把指針變相地往各種語言中放;不過有人在看了Java中大量地使用了各種類后,也
戲稱Java的發明者James Gosling為“‘全都是類’先生”,真是其中滋味,盡在不言中
啊。
知識點 | C# | java |
注釋 | // /* */ ///文檔注釋 | // /* */ /** */文檔注釋 |
main | Main | main |
書名 | 書名可以與文件名不同 | 書名與文件名必須相同 |
string | String string | String |
輸出 | Console.Write() Console.WriteLine() | System.out.print 不換行 println |
輸入 | Console.ReadLine() 結果是字符串 | Scanner input=new Scanner(System.in); int a=input.nextInt() 分類型 |
變量 | 先賦值后使用 不可以重復定義變量 包括局部變量 局部變量作用域相同 | 相同 相同 不包括局部變量 局部變量作用域相同 |
數據類型 | String string bool 其它的相同 空間大小一樣 float a=31.4f; | String boolean 一樣 |
類型轉換 | 隱式轉換(自動轉換)類型相似由小到大 (類型)值 由字符串轉其它類型 類型.Parse(必須是字符串); 任意類型之間相互轉換 Char a=’0’,int b=a;可以 Int b=48;char a=b;不可以c Char a=48;不可以 | 相同 (類型)值 Char 65—A 97-a 48—0 怒我 就氣 死吧 Char a=’0’; Int b=a; 可以 Int b=48; Char a=b//不可以 Char c=48//可以 |
占位符 | C#有 | 無 |
if | 相同 | 相同 |
Switch() | 語法相同 Case default里面的break不能省 Switch(java出現的都可以,還可以出現字符串) | 語法相同 可以省 Switch只可以判int char 不可以判字符串 |
Scanner | 沒有 | 有 |
Arrays | Array | Arrays |
Random | Random rd=new Random() rd.Next(10);//0-9之間的一個整數 rd.Next(1,10);// 1-10之間的一個整數 | 相同 rd.nextInt(10); 無 |
二維數組 | int[,] a=new int[3,4]; 3層樓每層4間 | int[][] a=new int[3][4]; |
? | ? | ? |
一維數組 | Int[] a;//申請一條街 a=new int[5];//在街上蓋房子 //逐間住人 a[0]=1;a[1]=2;… //循環查詢 For(int i=0;i<a.Length;i++) //a[i]; Int[] a=new int[5];//二合一 Int[] a=new int[]{1,2,3,4,5}; Int[] a= {1,2,3,4,5}; Int a[];//錯誤 Int[] a=new int[3]{1,2,3};//正確 Int[] a=new int[4]{1,2,3};//錯誤 | Int a[]; 正確 Int[] a=new int[3]{1,2,3};//錯誤 |
變量命名 | $不可以 | 以字母、下劃線、$打頭,后面還可以出數字 |
C# | java |
String string | String |
求長度 Length 屬性 | length() 方法 |
Equals() | equals() |
沒有 | equalsIgnoreCase() |
ToUpper() | toUpperCase() |
ToLower() | toLowerCase( ) |
+ | concat() + |
Indexof(char string) | indexOf(int String ) |
lastIndexOf(char string) | lastIndexOf( int String) |
String str=”abc123” Str.Substring(2,3);//c12 | String str=”abc123” Str.substring(2,3);//c |
Trim() 去除首尾空格 | trim() |
Split(char /char[]) 分開 string[] sp = str.Split('-'); foreach (string a in sp) { Console.WriteLine(a); } | 沒有 |
Join(“連接串”,被連接的字符串數組) 連接 str = string.Join(".", sp); Console.WriteLine(str); | 沒有 |
其它類型轉字符串 其它值.ToString(); Int a | 沒有 |
foreach | ? |
? | ? |
? | ? |
? | ? |
? | ? |