CLS(公共語言規範)

来源:https://www.cnblogs.com/green-jcx/archive/2022/04/12/16134500.html
-Advertisement-
Play Games

1.舉例 為了方便加深理解,我準備先講解一個例子來映襯出CLS的主要作用。 每個國家在成立之後肯定會於他國之間建立外交關係從而進行一些貿易往來,剛開始可能只會存在與一兩個國家達成了合作,所以只會與少數的國家進行貿易往來。在進行貿易往來前為了溝通順暢,國家之間交流的語言必須要一致,這個時候通常的方式是 ...


1.舉例

為了方便加深理解,我準備先講解一個例子來映襯出CLS的主要作用。

每個國家在成立之後肯定會於他國之間建立外交關係從而進行一些貿易往來,剛開始可能只會存在與一兩個國家達成了合作,所以只會與少數的國家進行貿易往來。在進行貿易往來前為了溝通順暢,國家之間交流的語言必須要一致,這個時候通常的方式是:A國家去學習B國家的語言,又或者B國家去學習A國家,從而實現語言溝通順暢。

 

隨著國家的不斷壯大,那麼能夠外交合作的國家會越來越多,如果還是按照上面的方式建立語言的溝通方式,這個時候就有一個問題:即如果外交國有N個,那麼就要學習N個國家的語言。雖然可以這麼做,但這並不是一種科學的方式。基於這種現象就誕生出了一種通用語言,這個通用語言從而打破了所有國家之間交流的屏障。當然,在我們現實生活中也存在著這種國際通用語言,那就是英語。

 

2.主要作用

在.Net平臺中同樣會出現上面例子中問題。假設你在.Net平臺下設計了一門語言叫N#,那麼在沒有一套通用語言規範的前提下,你可以去引用C#編寫的程式集從而實現交互嗎?答案顯然是不能。即使是你和C#一樣可以完美的在.Net框架下運行,但是它們之間沒有共通之處。

 

這個時候你可能會像上面的例子一樣,去學習C#語言從而實現一些共通之處,從而實現兩個不同語言項目間的引用。但是你要搞清楚,在.Net平臺下不會僅僅只有你們兩種編程語言存在,並且.Net的設計目標是實現一個開放的平臺,也意外著它會存在多種語言,我們不可能為了引用一個語言就跟這個語言建立一種獨立的溝通方式。

 

因此就需要一套規範和標準來實現各語言間的共通之處,即使是要引用或被引用N個不同的語言項目,只要大家就遵循這個規範,就能實現跨語言的程式集引用。那麼在.Net中的這個規範就叫做CLS(Common Language Specification,公共語言規範)

 

3.實現引用不代表公開

在我們有了CLS的語言規範後實現了不同語言項目之間的程式集引用,但在多個程式集之間引用的時候,並不意味者某個程式集必須將自己所有的內容提供給對方程式集,而僅僅是針對程式集中公開的(public)部分,而其中不公開的部分(private、internal、protected)是不會被對方獲取到的。所以在遵循CLS規範的同時也需要衡量下,那些需要提供給對方,那些不需要,然後你只針對對方需要的部分進行公開(public)。

 

4.具體的規範

上面已經講了CLS的主要作用和一些細節,但這些只是停留在概念上,下麵我舉幾個CLS當中實際的規範,以便加深理解。

4.1.命名約定

有些編程語言的不區分大小寫的,但是CLS規範中就必須要求區分大小寫。下麵我們通過一個代碼示例來證明這一規範。

圖中首先要說明的就是在命名空間上標識的特性:[assembly: CLSCompliant(true)],這個特性的作用是便於我們在編譯前檢查程式集中的代碼是否符合CLS的規範。從上圖結果來看顯然是不符合的,因為CLS是區分大小寫的,它會將Person和person作為同一個類,但是上面的C#代碼並沒進行大小寫區分。

另外還要註意的一點,就是特性[assembly: CLSCompliant(true)],檢查出不符合CLS的規範時,只會給出警告,並不會標識為錯誤。你可以忽略,但是這代表這個程式集不能由其他語言編寫的程式集所引用。

4.2.構造函數

CLS對構造函數的一個規範是:一個類如果有繼承關係,那麼子類必須要調用父類的構造函數。下麵我們通過一個代碼示例來證明這一規範。

Doctor類中並沒有調用其父類Person的構造函數,所以是不符合CLS規範。這個規範和上面的規範有不同之處,因為C#本身已經包含了和CLS相同的規範,那麼這個規範在C#中就作為強制的了,直接提示出了錯誤而非警告。

 

關於CLS具體的規範還有很多,本文不在這裡一一展開,本文旨在對CLS(公共語言規範)有一個初步的理解,如果需要詳細的深入,可以瀏覽.Net官方地址:

https://docs.microsoft.com/zh-cn/dotnet/standard/language-independence

 

知識改變命運
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • hello大家好,我是小樓。 最近踩了個DNS解析的小坑,雖然問題解決了,但排查過程比較曲折,最後還是有一點沒有想通,整個過程分享給大家。 背景 最近負責的服務要置換機器。置換機器可能很多小伙伴不知道是幹啥,因為大家平時接觸不到,我簡單解釋一下什麼是機器置換以及為什麼需要機器置換。 機器置換通俗地講 ...
  • 一、序言 在Web開發中,總有一些介面需要暴露在用戶認證前訪問,簡訊發送介面特別是簡訊驗證碼註冊介面便是其中典型的一類,這類介面具有如下特點: 流量在用戶認證之前 流量在用戶認證之前,意味著無法獲取用戶ID等唯一標識符信息對流量限流 手機號未知 手機號未知意味著無法對待發送簡訊的手機號做精準檢測,判 ...
  • 記錄一些自己犯過的錯誤和一些異常信息 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 綁定異常 mapper和xml文件綁定問題 第一步:先看看xml文件的namespace是否對應著m ...
  • 不是特別完整和齊全,自己的一些小感悟,希望能幫助大家。對新手很友好,哈哈哈。輸入:Scanner in=new Scanner(System.in); 新創建一個輸入的Scanner對象,然後賦值給in,這個作用就是獲取控制台的輸入!!! in.nextInt()表示讀入一個整數 int a; 表示 ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • unity 編輯器擴展簡單入門 通過使用編輯器擴展,我們可以對一些機械的操作實現自動化,而不用使用額外的環境,將工具與開發環境融為一體;並且,編輯器擴展也提供GUI庫,來實現可視化操作;編輯器擴展甚至也可以“補充”IDE缺失的一些內容,讓IDE更加人性化。 主要內容 MenuItem無界面操作 視窗 ...
  • VBScript是Visual Basic Script的簡稱,即 Visual Basic 腳本語言,有時也被縮寫為VBS。 ...
  • 1. 前言 上一篇文章我們瞭解了bombardier,並知道了bombardier.yml與開源項目bombardier的關係,接下來的文章我們瞭解一下wrk、wrk2,並對比一下它們與bombardier的關係 2. 認識wrk wrk是一種現代 HTTP 基準測試工具,能夠在單個多核 CPU 上 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...