国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

查看: 2646|回復: 0
打印 上一主題 下一主題

C#秒殺Java的五個不可替代的特性,完美的編程語言并不存在

[復制鏈接]
跳轉到指定樓層
樓主
發表于 2017-8-29 13:38:42 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
關鍵詞: Java , 聯璧港
如果我們可以同時擁有 C# 和 Java 世界的最好特性,那會是什么樣呢?
完美的編程語言并不存在,我希望我們可以在這一點上達成一致。開發新語言往往是為了克服另一種語言的弊端,又不可避免的在某些方面上健壯一些,卻在另一些方面上存在不足。
C# 與 Java 都起源于 C/C++ 語言,他們在面向對象方面有許多相似之處。除了 Java JVM 和 C# .NET CLR 有許多相同結構上的相似性之外,他們各自的開發團隊都有各自的發展方向,他們關注的是各自的語言應該成為什么樣子。
我們并不想糾結于某一個語言比另一個語言好,我們只想羅列出 C# 開發者能用到而 Java 中沒有的那些特性而已。
下面我們開始吧。
1LINQ
LINQ (Language-IntegratedQuery,語言集成查詢) 于 2007 年引入到 C#,以幫助開發人員從各種數據源查詢數據。使用它,我們可以在無需考慮正在調用的特定數據庫的語法來編寫查詢語句。LINQ provider 所提供的一個組件將查詢轉換為下層數據源可讀的格式。例如,如果我們需要從 SQL 數據庫查詢數據,LINQ to SQL provider 程序將把 LINQ 查詢轉換成 T-SQL,以便數據庫可以理解它。
要在 LINQ 中執行查詢操作,首先獲取數據庫,然后創建查詢,最后執行查詢。在 LINQ to Object 查詢中,這可能僅像一樣代碼一樣簡單,而不是為每個循環編寫嵌套的復雜迭代。
例如,我們來看看這個代碼,用于在 C# 中從列表中過濾 2 位數。
首先,在不使用 LINQ 的情況下:
這里兩種語法都是正確的,唯一的區別就是查詢語法看起來更像是 SQL語句而方法語法使用 lambda 表達式(當然,看起來很像我們在 Java 里寫的某些代碼)
綜述:LINQ 所依賴的許多特性,如 lambda 表達式(就 LINQ 來說非常有用),已經在 Java 中有了等效的實現,盡管我們可以使用流和 lambda 來查詢數據,但 LINQ 簡化了整個過程并且移除了很多在 Java 中存在的冗余代碼。
2Struct
C# 中的結構體類似于類。實際上,一個 struct 甚至可以被認為是一個“輕量級類”,因為它可以包含構造函數、常量、方法等等。一個結構體和一個類之間最大的區別在于結構是值類型,而類是引用類型。
相比于創建類,編寫結構體最重要的好處是在構造一個值類型時比在構造引用類型時更容易確保值語義。如 Microsoft 的文檔所述,“struct 類型的變量直接包含結構體的數據,而類類型的變量包含對數據的引用。”因此,對比使用類時,使用結構體的好處之一是,從代碼的其他部分更改其值的唯一方法是將其作為參考進行顯式傳遞。
微軟的開發人員建議對于那些小于 16 字節、生命周期短、不改變的而且不常裝箱的類型,使用結構體(struct)而不是類(class)。在這種情況下,使用結構體可能會比使用類更有效率,因為它會保存在棧而不是堆中。
小結:很多情況下使用結構體可以節省內存分配和釋放的時間,這確實很有吸引力。然而事實是值類型擁有自己的存儲空間。無論結構體擁有如何明顯的優點和缺點,這在 Java 中都不需要操心。
3Async/Await在一段代碼中調用 async,或者更明確地調用方法,這個方法都會在另一個線程上執行,不會阻塞當前線程。當代碼運行到 await 命令的時候,它會繼續運行(await 的語句)。如果這時 async 代碼還沒有完成,那么執行中的程序會返回到調用點。
這有助于提高應用程序總體的響應速度,以及減少性能瓶頸。在應用程序訪問 Web 和進行所有 UI 相關的活動時,使用異步程序非常重要。相對于以前的異步編程實現,使用 async/await 可以保留你代碼的邏輯結構,而編譯器則會擔負起以前由開發者擔負的重擔。
概要:CompletableFutures 無疑可以使我們更趨近于擁有等效于 C# 和Java 所擁有的異步編程中的能力。盡管如此,使用它所帶來的復雜性使其易用度不能與使用 async/await 關鍵字進行的實現相提并論。
4Lazy 無論使用 C# 還是 Java,很多人都已經實現了延遲初始化 (或實例化),因此對象要在第一次使用的時候才會被創建。有一種常見的例子是將延遲初始化用于應用程序啟動的時候加載大量對象,但實際需要初始化的對象可能只有少數幾個。這種情況下,我們希望辨別哪些是不需要在這里初始化的。只初始化那些確實需要初始化的對象可以提升應用程序的性能。
小結:最近,Lambda 表達式引入到 Java 8 之后,在 Java 中實現延遲加載(還有不少其它事情)變得更容易了。不過,在 C# 中我們可以使用語義化的 Lazy 封裝類來延遲初始化任何類庫或用戶指定的類型。
5一些等價的關鍵詞
語言中的有用功能不一定像在 C# 中的 LINQ 或 Java 中的模塊一樣大。這里有一些可以幫助 C# 開發人員的關鍵字,它們在 Java 中并沒有:
as
C# 中的 as 關鍵字會嘗試安全地將對象轉換為某個類型,如果不能轉換的話,就返回 null。與 Java 的instanceof幾乎等同,但它是一個布爾值,如果類型匹配則返回 true,否則返回 false。
Yield
在 C# 中使用 Yield 和 return yield 來進行自定義且狀態化的迭代,不需要顯式創建額外的類,也不需要創建臨時集合。在 Java 中我們實現迭代最好的選擇是使用外部庫或使用 Java 8 引入的 Lambda 表達式。

var
Var 是一種隱式類型,其實際類型由編譯器決定,其功能相當于寫一個顯式類型(比如 int, string 等)。它除了可以減少一些按鍵之外,var 還允許用于匿名類型,而匿名類型在 LINQ 中很常用。我們期待看到“var”標識,備受矚目的 Java SE 9 將實現“將類型推導擴展到定義并初始化局部變量時。”
Checked
C# 中,我們使用 checked 關鍵字顯式啟用對整型表達式的溢出檢查。如果表達式的運算結果超出目標類型的范圍,我們可以使用 checked 強制要求運行時拋出OverflowException。這十分有用,因為常量表達式會在編譯期進行溢出檢查,而非常量表達式不會。
聯璧港,專業的AI SDK平臺,豐富資源,海量渠道
官網:http://lbp.lincomb.com/

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色香婷婷 | 日韩欧美视频一区 | 一级爱爱片一级毛片-一毛 一级a爰片久久毛片 | 女人18片免费视频网站 | 久久精品爱国产免费久久 | 四虎国产在线观看 | www.99在线观看| 四虎影院国产精品 | 干干日日| 亚洲国产精品自产在线播放 | 视频国产91 | 人人人干| 精品卡通动漫在线观看视频一区 | 国产99视频精品免费视频7 | 两个人免费视频看完整 | 欧美成人三级大全 | 日韩a一级欧美一级在线播放 | 国产一区日韩二区欧美三 | 要爽死国产一区在线播放 | 四虎成人免费网址在线 | 一级片手机在线 | 久久黄色精品视频 | 深爱五月综合网 | 亚洲图色网站 | 爱插网| 日韩欧美精品有码在线观看 | 亚洲激情区 | 日韩国产欧美一区二区三区 | 草草第一页| 视频在线观看h | 自拍偷拍亚洲区 | 破外女出血一级毛片 | 污污的免费网站 | 狠狠狠色丁香婷婷综合久久俺 | 91资源在线播放 | 中文字幕一区二区三区 精品 | aaa大片 | 国产偷自拍 | 麻豆精品视频 在线视频 | 一级毛片特级毛片国产 | 亚洲婷婷第一狠人综合精品 |