Ref和Out關鍵字的區別: 使用Ref型參數時,傳入的參數必須先被初始化。而Out則不需要,對Out而言,就必須在方法中對其完成初始化 首先:兩者都是按地址傳遞的,使用後都將改變原來的數值。很多人在論壇上解釋說out是按數值傳遞,是錯誤的。簡單的測試後可以知道out使用也能改變數值的,所以肯定是按照地址傳遞的。 其次:ref可以把參數的數值傳遞進函數,但是out是要把參數清空,就是說你無法把一個數值從out傳遞進去的,out進去後,參數的數值爲空,所以你必須初始化一次。這個就是兩個的區別,或者說就像有的網友說的,ref是有進有出,out是隻出不進。經典!!! Out更適合用在需要Return多個返回值的地方,而Ref則用在需要被調用的方法修改調用者的引用的時候。 · Const是編譯是常量,readonly是運行是常量 · Const只能應用於原始數據類型,而readonly可以是任何類型 · Const在聲明的時候必須賦值,而readonly聲明時可以不賦值,但二者一旦賦值都不可以改變 · Const可以修飾類中成員,也可以修飾類中方法內部成員,而readonly只可以修飾類中成員。 · Const速度快,但靈活性低,readonly速度慢,但靈活性高靜態構造函數具有以下特點: 靜態構造函數既沒有訪問修飾符,也沒有參數。 在創建第一個實例或引用任何靜態成員之前,將自動調用靜態構造函數來初始化類。 無法直接調用靜態構造函數。 在程序中,用戶無法控制何時執行靜態構造函數。 靜態構造函數的典型用途是:當類使用日誌文件時,將使用這種構造函數向日志文件中寫入項。 靜態構造函數在爲非託管代碼創建包裝類時也很有用,此時該構造函數可以調用 LoadLibrary 方法。 示例 在此示例中,類 Bus 有一個靜態構造函數和一個靜態成員 Drive()。當調用 Drive() 時,將調用靜態構造函數來初始化類。 C#複製代碼 public class Bus { // Static constructor: static Bus() { System.Console.WriteLine("The static constructor invoked."); } public static void Drive() { System.Console.WriteLine("The Drive method invoked."); } } class TestBus { static void Main() { Bus.Drive(); } } 輸出 The static constructor invoked. The Drive method invoked.
索引器與屬性類似。除下表中顯示的差別外,爲屬性訪問器定義的所有規則同樣適用於索引器訪問器。 屬性 索引器 允許調用方法,如同它們是公共數據成員。 允許調用對象上的方法,如同對象是一個數組。 可通過簡單的名稱進行訪問。 可通過索引器進行訪問。 可以爲靜態成員或實例成員。 必須爲實例成員。 屬性的 get 訪問器沒有參數。 索引器的 get 訪問器具有與索引器相同的形參表。 屬性的 set 訪問器包含隱式 value 參數。 除了 value 參數外,索引器的 set 訪問器還具有與索引器相同的形參表。
接口可以包含哪些成員 答: 接口可以包含屬性、方法、索引指示器和事件,但不能包含常量、域、操作符、構造函數和析構函數,而且也不能包含任何靜態成員
大家都容易把這兩者搞混,我也一樣,在聽李建忠老師的設計模式時,他也老把抽象類說成接口,弄的我就更糊塗了,所以找了些網上的資料. 一、抽象類: 抽象類是特殊的類,只是不能被實例化;除此以外,具有類的其他特性;重要的是抽象類可以包括抽象方法,這是普通類所不能的。抽象方法只能聲明於抽象類中,且不包含任何實現,派生類必須覆蓋它們。另外,抽象類可以派生自一個抽象類,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其派生類必須覆蓋它們。 二、接口: 接口是引用類型的,類似於類,和抽象類的相似之處有三點: 1、不能實例化; 2、包含未實現的方法聲明; 3、派生類必須實現未實現的方法,抽象類是抽象方法,接口則是所有成員(不僅是方法包括其他成員); 另外,接口有如下特性: 接口除了可以包含方法之外,還可以包含屬性、索引器、事件,而且這些成員都被定義爲公有的。除此之外,不能包含任何其他的成員,例如:常量、域、構造函數、析構函數、靜態成員。一個類可以直接繼承多個接口,但只能直接繼承一個類(包括抽象類)。 三、抽象類和接口的區別: 1.類是對對象的抽象,可以把抽象類理解爲把類當作對象,抽象成的類叫做抽象類.而接口只是一個行爲的規範或規定,微軟的自定義接口總是後帶able字段,證明其是表述一類類“我能做。。。”.抽象類更多的是定義在一系列緊密相關的類間,而接口大多數是關係疏鬆但都實現某一功能的類中. 2.接口基本上不具備繼承的任何具體特點,它僅僅承諾了能夠調用的方法; 3.一個類一次可以實現若干個接口,但是隻能擴展一個父類 4.接口可以用於支持回調,而繼承並不具備這個特點. 5.抽象類不能被密封。 6.抽象類實現的具體方法默認爲虛的,但實現接口的類中的接口方法卻默認爲非虛的,當然您也可以聲明爲虛的. 7.(接口)與非抽象類類似,抽象類也必須爲在該類的基類列表中列出的接口的所有成員提供它自己的實現。但是,允許抽象類將接口方法映射到抽象方法上。 8.抽象類實現了oop中的一個原則,把可變的與不可變的分離。抽象類和接口就是定義爲不可變的,而把可變的座位子類去實現。 9.好的接口定義應該是具有專一功能性的,而不是多功能的,否則造成接口污染。如果一個類只是實現了這個接口的中一個功能,而不得不去實現接口中的其他方法,就叫接口污染。 10.儘量避免使用繼承來實現組建功能,而是使用黑箱複用,即對象組合。因爲繼承的層次增多,造成最直接的後果就是當你調用這個類羣中某一類,就必須把他們全部加載到棧中!後果可想而知.(結合堆棧原理理解)。同時,有心的朋友可以留意到微軟在構建一個類時,很多時候用到了對象組合的方法。比如asp.net中,Page類,有Server Request等屬性,但其實他們都是某個類的對象。使用Page類的這個對象來調用另外的類的方法和屬性,這個是非常基本的一個設計原則。 11.如果抽象類實現接口,則可以把接口中方法映射到抽象類中作爲抽象方法而不必實現,而在抽象類的子類中實現接口中方法. 四、抽象類和接口的使用: 1. 如果預計要創建組件的多個版本,則創建抽象類。抽象類提供簡單的方法來控制組件版本。 2.如果創建的功能將在大範圍的全異對象間使用,則使用接口。如果要設計小而簡練的功能塊,則使用接口。 3.如果要設計大的功能單元,則使用抽象類.如果要在組件的所有實現間提供通用的已實現功能,則使用抽象類。 4.抽象類主要用於關係密切的對象;而接口適合爲不相關的類提供通用功能。 以下是我在網上看到的幾個形象比喻,真的非常不錯,呵呵: 1.飛機會飛,鳥會飛,他們都繼承了同一個接口“飛”;但是F22屬於飛機抽象類,鴿子屬於鳥抽象類。 2. 就像鐵門木門都是門(抽象類),你想要個門我給不了(不能實例化),但我可以給你個具體的鐵門或木門(多態);而且只能是門,你不能說它是窗(單繼承);一個門可以有鎖(接口)也可以有門鈴(多實現)。 門(抽象類)定義了你是什麼,接口(鎖)規定了你能做什麼(一個接口最好只能做一件事,你不能要求鎖也能發出聲音吧(接口污染))。
私有構造函數(C# 編程指南) 私有構造函數是一種特殊的實例構造函數。它通常用在只包含靜態成員的類中。如果類具有一個或多個私有構造函數而沒有公共構造函數,則不允許其他類(除了嵌套類)創建該類的實例。例如: C#複製代碼 class NLog { // Private Constructor: private NLog() { } public static double e = System.Math.E; //2.71828... } 聲明空構造函數可阻止自動生成默認構造函數。注意,如果您不對構造函數使用訪問修飾符,則在默認情況下它仍爲私有構造函數。但是,通常顯式地使用 private 修飾符來清楚地表明該類不能被實例化。 當沒有實例字段或實例方法(如 Math 類)時或者當調用方法以獲得類的實例時,私有構造函數可用於阻止創建類的實例。如果類中的所有方法都是靜態的,可考慮使整個類成爲靜態的。有關更多信息,請參見靜態類和靜態類成員。 示例 下面是使用私有構造函數的類的示例。 C#複製代碼 public class Counter { private Counter() { } public static int currentCount; public static int IncrementCount() { return ++currentCount; } } class TestCounter { static void Main() { // If you uncomment the following statement, it will generate // an error because the constructor is inaccessible: // Counter aCounter = new Counter(); // Error Counter.currentCount = 100; Counter.IncrementCount(); System.Console.WriteLine("New count: {0}", Counter.currentCount); } } 輸出 New count: 101 注意,如果您取消註釋該示例中的以下語句,它將生成一個錯誤,因爲該構造函數受其保護級別的限制而不可訪問: C#複製代碼 // Counter aCounter = new Counter(); // Error
DevExpress Office File API是一個專爲C#, VB.NET 和 ASP.NET等開發人員提供的非可視化.NET庫。有了這個庫,不用安裝Microsoft Office,就可以完全自動處理Excel、Word等文檔
JetBrains IDEs日前正式發佈了v2024.1版本,此版本中最大的亮點就是帶來了AI賦能的全行代碼補全,同時在最新的IDEs中重做了終端、擁有更強大的代碼編輯和導航功能、更智能的代碼分析和提示、更優化的性能、更豐富的插件和集成等。
通義靈碼自從入職阿里雲以來備受行業關注。5 月 24 日,阿里雲工程師奔赴北京、成都、杭州三城,向企業和開發者介紹並演示通義靈碼,通義靈碼依然是大家話題的C位,並收穫了衆多粉絲。 @杭州 阿里雲金融創新峯會 今天,2024 阿里雲金融創新峯
· 前言 · 在國內,公網服務器與本地服務器的通信一直是個難題,本地服務器因爲IP是動態變化的,公網服務器沒辦法將請求發送給本地服務器。爲了解決這個問題,所以採用WebSocket協議替換Http協議。爲了實現請求等待,使用Gu
在這裏分享一下通過拖取 DataCube 代碼審計後發現的一些漏洞,包括前臺的文件上傳,信息泄露出賬號密碼,後臺的文件上傳。當然還有部分 SQL 注入漏洞,因爲 DataCube 採用的是 SQLite 的數據庫,所以SQL 注入相對來說顯
轉載自劉茫茫看山 問題背景 某天我們的租戶反饋數據庫連接缺少必要的驅動,我們通過日誌查看確實是缺少部分數據庫的驅動,因爲DolphinScheduler默認只帶了Oracle和MySQL的驅動,並且需要將pom文件中的test模式去掉纔可以
鴻蒙原生應用再新丁!新華社 入局鴻蒙 來自 #HarmonyOS# 微博5月27日消息 #鴻蒙千帆起#新華社客戶端完成鴻蒙原生應用核心版本開發,將實現不同使用場景下更加智能、精準、及時的要聞推送,以及主流價值的全場景覆蓋和高效傳播!與此同
記一次攻防演練中幸運的從若依弱口令到後臺getshell的過程和分析。 0x01 漏洞發現 首先,我會先把目標的二級域名拿去使用搜索引擎來搜索收集到包含這個目標二級域名的三級域名或者四級域名的網站。 這樣子可以快速的定位到你所要測試的漏洞
通過類之間的關係圖,讀懂spring boot原理 RequestBodyAdvice接口用於對Controller方法接收的請求體進行全局處理,可以在請求體被讀取之前或之後對請求體進行修改、包裝或添加一些額外的處理邏輯。下面是Req
鴻蒙原生應用再新丁!學習強國 入局鴻蒙 來自 #HarmonyOS# 微博5月23日消息 中央宣傳部宣傳輿情研究中心宣佈,將基於HarmonyOS NEXT鴻蒙星河版啓動“學習強國”App鴻蒙原生應用開發!“學習強國”App將爲鴻蒙生態帶
前言 在無線網絡技術不斷髮展的今天,Wi-Fi已經成爲了我們日常生活中不可或缺的一部分。無論是家庭娛樂、辦公還是在線遊戲,Wi-Fi都在提供着便捷的互聯網接入服務。然而,在安卓8.1後,爲了進一步延長安卓設備的待機時間。原生安卓(AO
鴻蒙原生應用再新丁!芒果TV 入局鴻蒙 來自 #HarmonyOS# 微博5月21日消息 深受年輕人喜愛的@芒果TV 宣佈完成鴻蒙原生應用Beta版開發🎉芒果TV獨家精品內容結合HarmonyOS NEXT創新能力,將爲用戶帶來更加便捷
我們已經學習了很多自動化的知識了,接下來讓我們看看在blog-auto-publishing-tools中是如何實現自動發送博文到知乎的。 前提條件 前提條件當然是先下載 blog-auto-publishing-tools這個博客自動發佈
DevExpress擁有.NET開發需要的所有平臺控件,包含600多個UI控件、報表平臺、DevExpress Dashboard eXpressApp 框架、適用於 Visual Studio的CodeRush等一系列輔助工具。屢獲大獎的
本文分享自華爲雲社區《代碼的安全檢視》,作者:Uncle_Tom。 1. 熵的故事 熵的概念最早起源於物理學,用於度量一個熱力學系統的無序程度。熱力學第二定律,又稱“熵增定律”,表明了在自然過程中,一個孤立的系統總是從最初的集中、有序的排