C# 基礎知識總結

要學好C#,基礎知識的重要性不言而喻,現將常用到的一些基礎進行總結,總結如下:

01. 數據類型轉換

  強制類型轉換(Chart--> int):

 ?char cr='A'; ??int i = (int)(cr);

02. 委托/匿名函數/Lamda表達式:

? ? 委托是匿名函數的起源,Lamda表達式又是匿名函數的升華。這些又是如何體現的呢,請看:

? ? 委托示例:

namespace Delegate
{class Program{public delegate void TDelegate(int i, int j);static void Caculator(int i, int j){Console.WriteLine(i * j * i * j);}public static void InvokeDE(){TDelegate td = new TDelegate(Caculator);td.Invoke(3, 5);}static void Main(string[] args){InvokeDE();Console.ReadLine();}}
}
View Code

? ? 匿名函數示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CSP
{class Program{public delegate void MyDelegate(int x, int y);static void Main(string[] args){MyDelegate md = delegate(int x, int y){Console.WriteLine(x + y);};md(10, 100);Console.ReadLine();}}
}
View Code

? ?Lamda表達式(實際就是一個函數)示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CSP
{class Program{private static void LamdaExpression(){int[] InitArr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int ResCount = InitArr.Where(n => n > 6).Count();Console.WriteLine(ResCount);}static void Main(string[] args){LamdaExpression();Console.ReadLine();}}
}
View Code

03. 泛型Gereric:

? ??泛型是C#一個非常重要的用法,必須熟記于心:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CSP
{class Program{public static void GenericFunction(){int i = 10;string HI = "Hello World!";TestGC<int> tg_int = new TestGC<int>(i);TestGC<string> tg_string = new TestGC<string>(HI);Console.WriteLine(tg_int.t.ToString());Console.WriteLine(tg_string.t.ToString());}static void Main(string[] args){GenericFunction();Console.ReadLine();}}public class TestGC<T>{public T t;public TestGC(T t){this.t = t;}}
}
View Code

04. ?虛方法Virtual:

? ? ?以前總覺得自己掌握的很好了,最近看了一些文章才對Virtual的執行順序有了更深的理解,為了加深印象,我添加了示例圖并特地將本篇文章在此處進行了引用:

class A
{public virtual void Func() // 注意virtual,表明這是一個虛擬函數 
    {Console.WriteLine("Func In A");}
}
class B : A // 注意B是從A類繼承,所以A是父類,B是子類 
{public override void Func() // 注意override ,表明重新實現了虛函數 
    {Console.WriteLine("Func In B");}
}
class C : B // 注意C是從B類繼承,所以B是父類,C是子類 
{
}
class D : A // 注意D是從A類繼承,所以A是父類,D是子類 
{public new void Func() // 注意new,表明覆蓋父類里的同名類,而不是重新實現 
    {Console.WriteLine("Func In D");}
}
class E : D // 注意E是從D類繼承,所以D是父類,E是子類 
{}
class F : A
{private new void Func() //注意new關鍵字前有private修飾符,故該隱藏只在F類內有效
    {Console.WriteLine("Func In F");}public void Func2() {Func(); //在F類內隱藏了基類的Func方法,故此處調用的private new void Func()
    }
}static void Main(string[] args)
{A a; // 定義一個a這個A類的對象.這個A就是a的申明類 A b; // 定義一個b這個A類的對象.這個A就是b的申明類 A c; // 定義一個c這個A類的對象.這個A就是c的申明類 A d; // 定義一個d這個A類的對象.這個A就是d的申明類 A e; // 定義一個e這個A類的對象.這個A就是e的申明類 A f; // 定義一個f這個A類的對象.這個A就是f的申明類 a = new A(); // 實例化a對象,A是a的實例類 b = new B(); // 實例化b對象,B是b的實例類 c = new C(); // 實例化c對象,C是c的實例類 d = new D(); // 實例化d對象,D是d的實例類 e = new E(); // 實例化e對象,E是e的實例類f = new F(); // 實例化f對象,F是f的實例類Console.WriteLine("a.Func();");a.Func(); // 執行a.Func:1.先檢查申明類A 2.檢查到是虛擬方法 3.轉去檢查實例類A,就為本身 4.執行實例類A中的方法 5.輸出結果 Func In A Console.WriteLine("b.Func();");b.Func(); // 執行b.Func:1.先檢查申明類A 2.檢查到是虛擬方法 3.轉去檢查實例類B,有重載的 4.執行實例類B中的方法 5.輸出結果 Func In B Console.WriteLine("c.Func();");c.Func(); // 執行c.Func:1.先檢查申明類A 2.檢查到是虛擬方法 3.轉去檢查實例類C,無重載的 4.轉去檢查類C的父類B,有重載的 5.執行父類B中的Func方法 5.輸出結果 Func In B Console.WriteLine("d.Func();");d.Func(); // 執行d.Func:1.先檢查申明類A 2.檢查到是虛擬方法 3.轉去檢查實例類D,無重載的(這個地方要注意了,雖然D里有實現Func(),但沒有使用override關鍵字,所以不會被認為是重載) 4.轉去檢查類D的父類A,就為本身 5.執行父類A中的Func方法 5.輸出結果 Func In A Console.WriteLine("e.Func();");e.Func(); // 執行e.Func:E繼承D,E.Func沒有重寫父類中的方法,相當于執行父類D中的Func方法,輸出結果 Func In A Console.WriteLine("f.Func();");f.Func(); // 執行f.Func:F類中雖然隱藏了基類中的Func方法,但是有private修飾符,該隱藏只在F類范圍內有效。執行f.Func相當于執行其基類中的Func方法,輸出結果 Func In A 
    D d1 = new D();Console.WriteLine("d1.Func();");d1.Func(); // 執行D類里的Func(),輸出結果 Func In D 
E e1 = new E();Console.WriteLine("e1.Func();");e1.Func(); // 執行E類里的Func(),輸出結果 Func In D
F f1 = new F();Console.WriteLine("f1.Func();");f1.Func(); // 執行F類里的Func(),輸出結果 Func In AConsole.WriteLine("f1.Func2();");f1.Func2(); // 執行F類里的Func2(),輸出結果 Func In F
   Console.ReadLine();
}
View Code

05. New和Override的用法:

? ? New是新建一個新方法,對舊方法進行了屏蔽,而Override只是對父類中的方法進行了覆蓋,具體詳細用法參見4. Virtual用法示例;

06.?foreach用法

? ? foreach遍歷訪問的對象需要實現IEnumerable接口或聲明GetEnumerator方法的類型;

  MSDN上的例子:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CSP
{public class Person{public string firstName;public string lastName;public Person(string fName, string lName){this.firstName = fName;this.lastName = lName;}}public class People : IEnumerable{private Person[] _people;public People(Person[] pArray){_people = new Person[pArray.Length];for (int i = 0; i < pArray.Length; i++){_people[i] = pArray[i];}}// Implementation for the GetEnumerator method.
        IEnumerator IEnumerable.GetEnumerator(){return (IEnumerator)GetEnumerator();}public PeopleEnum GetEnumerator(){return new PeopleEnum(_people);}}public class PeopleEnum : IEnumerator{public Person[] _people;int position = -1;public PeopleEnum(Person[] list){_people = list;}public bool MoveNext(){position++;return (position < _people.Length);}public void Reset(){position = -1;}object IEnumerator.Current{get{return Current;}}public Person Current{get{try{return _people[position];}catch (IndexOutOfRangeException){throw new InvalidOperationException();}}}}class App{static void Main(){Person[] peopleArray = new Person[3]{new Person("John", "Smith"),new Person("Jim", "Johnson"),new Person("Sue", "Rabon"),};People peopleList = new People(peopleArray);foreach (Person p in peopleList)Console.WriteLine(p.firstName + " " + p.lastName);Console.ReadLine();}}
}
View Code

?下面例子是對上面的改動,只保留了對GetEnumerator()方法的實現,移除了對IEnumerable接口和IEnumerator接口的繼承,執行結果同上例一樣:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CSP
{public class Person{public string firstName;public string lastName;public Person(string fName, string lName){this.firstName = fName;this.lastName = lName;}}public class People{private Person[] _people;public People(Person[] pArray){_people = new Person[pArray.Length];for (int i = 0; i < pArray.Length; i++){_people[i] = pArray[i];}}public PeopleEnum GetEnumerator(){return new PeopleEnum(_people);}}public class PeopleEnum{public Person[] _people;int position = -1;public PeopleEnum(Person[] list){_people = list;}public bool MoveNext(){position++;return (position < _people.Length);}public Person Current{get{try{return _people[position];}catch (IndexOutOfRangeException){throw new InvalidOperationException();}}}}class App{static void Main(){Person[] peopleArray = new Person[3]{new Person("John", "Smith"),new Person("Jim", "Johnson"),new Person("Sue", "Rabon"),};People peopleList = new People(peopleArray);foreach (Person p in peopleList)Console.WriteLine(p.firstName + " " + p.lastName);Console.ReadLine();}}
}
View Code

? ? PS.

  A.實現實現IEnumerable接口的同時就必須實現IEnumerator接口;

? ? B.不一定要實現IEnumerable接口,但一定要實現GetEnumrator方法

? ? 對于上述的功能,可以也嘗試使用語法糖(便捷寫法)C# yield來進行實現;

07.?靜態構造函數

  靜態構造函數,也稱靜態代碼塊,主要用于初始化靜態變量,示例如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CSP
{public class StaticBlock{public string Title;static StaticBlock(){Console.WriteLine("Here is the static block,only can be called for 1 time!");}public StaticBlock(string Title){this.Title = Title;}}class Program{static void Main(string[] args){StaticBlock sb_morning = new StaticBlock("Good morning!");Console.WriteLine(sb_morning.Title);StaticBlock sb_afternoon = new StaticBlock("Good afternoon!");Console.WriteLine(sb_afternoon.Title);Console.ReadLine();}}
}
View Code

  靜態構造函數具有如下特點(來自網絡):

  A.靜態構造函數既無訪問修飾符亦無參數;

? ? B.如果沒有編寫靜態構造函數,而這時類中包含帶有初始值設定的靜態字段,那么編譯器會自動生成默認的靜態構造函數

? ? C.在創建第一個類實例或任何靜態成員被引用時,.NET將自動調用靜態構造函數來初始化類,即無法直接調用與控制靜態構造函數。

? ? D.如果類中包含用來開始執行的 Main 方法,則該類的靜態構造函數將在調用 Main 方法之前執行

? ? E.如果類中的靜態字段帶有初始化,則靜態字段的初始化語句將在靜態構造函數之前運行。

? ? F.一個類只能有一個靜態構造函數,不可以被繼承且最多只運行一次

08. 反射typeof/GetType

  typeof:獲取類運行時的類型方法列表,參數只能為類名,用法typeof(類名);

? ??GetType:獲取類運行時的類型方法列表,由對象調用,用法:obj.GetType();

09.?where T : class

  ?主要用來對接口進行限制,如下所示,限制接口IDataComponentBase<T>中的T必須為一個引用類型,如類,接口,數組;

  public interface IDataComponentBase<T>?where T : class

10.?Guid對象賦值:

? ? Guid gd = new Guid("3a4f38a3-e064-e611-80d6-080027c84e1f");

11. Dispose():

? ??在使用using方法結束時會自動調用Dispose(),以便顯示釋放非托管資源(前提是該當前類必須實現接口:IDisposable);

12. 保留兩位小數:

? ? ? Decimal?OVNum,NCNum;

? ? ? ... ...

? ? ? Decimal TotNum = OVNum + NCNum;
? ? ? Decimal d = NCNum * 100 / TotNum;
? ? ? e.Result = Decimal.Round(d, 2);

13. 利用List自帶的Sort進行排序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CA
{class Program{static void Main(string[] args){List<Light> lts = new List<Light>();Light lt0 = new Light();lt0.LTypeName = "Filament";lt0.W = 12;Light lt1 = new Light();lt1.LTypeName = "Common";lt1.W = 25;Light lt2 = new Light();lt2.LTypeName = "Efficient";lt2.W = 50;lts.Add(lt0);lts.Add(lt1);lts.Add(lt2);Console.WriteLine("Before sort:");foreach (Light l in lts){Console.WriteLine(l.LTypeName+":"+l.W);}//A~Z//lts.Sort((x, y) => x.LTypeName.CompareTo(y.LTypeName));//Z~Alts.Sort((x, y) => -x.LTypeName.CompareTo(y.LTypeName));Console.WriteLine("After sort:");foreach (Light l in lts){Console.WriteLine(l.LTypeName + ":" + l.W);}Console.ReadLine();}}public class Light{public string LTypeName { get; set; }public int W { get; set; }}
}
View Code

14.?數組,ArrayList,List的區別:

  數組的優點是可以存儲多個維度的記錄,且連續存放,缺點是需要在定義時指定數組的長度,且定義好后不能擴展;

? ? ?ArrayList在定義時不需要指定長度不需要定義存入的數據的數據類型,可以自由擴展。所以ArrayList可以存放不同類型的數據(以object存入,要進行裝箱操作)到ArrayList,所以ArrayList為非類型安全的;

? ? ?使用如下所示:

  ArrayList al = new ArrayList();

  al.Add(100);

  al.Add("Hello");

  ?List與ArrayList一樣,在定義時不需要指定長度,可以自由擴展。同時,在聲明List時,需要定義存入的數據的數據類型,實現了類型安全;

  ?ArrayList的命名空間:System.Collections.ArrayList

? ? ?List的命名空間:System.Collections.Generic.List

15. const/readonly

用const聲明的常量為編譯時常量,readonly聲明的常量為運行時常量;
16. 協變/逆變
  
  在使用泛型的場合,把子類的引用賦給父類,參見該文章;

  關于C#還有更多內容需要研究,希望自己能再接再厲,繼續總結!

?

轉載于:https://www.cnblogs.com/sccd/p/5418326.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373489.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373489.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373489.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java注釋和真實世界的Spring示例

“注釋”是編程語言定義的一種&#xff0c;用作“標記”。 可以將它們視為編程語言引擎可以理解的注釋行。 它們不會直接影響程序的執行&#xff0c;但是會在需要時間接影響。 定義 注釋使用interface關鍵字定義&#xff0c;并且與接口相似。 它具有定義類似于接口方法的屬性。…

scrapy+mysql+pipeline+更新數據_python3+Scrapy爬蟲實戰(二)—— 使用pipeline數據保存到文本和數據庫(mysql)...

前言保存本地存儲Json數據配置setting保存數據庫創建數據庫創建表編寫pipelines配置setting本文是對上篇文章所講的代碼進一步優化&#xff0c;回看可以點這里&#xff0c;代碼就直接在上一篇代碼中進行改造&#xff0c;沒有的小伙伴可以在這里下載。前言Scrapy 提供了 pipelin…

NYOJ 44 子串和

子串和 時間限制&#xff1a;5000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;3描述 給定一整型數列{a1,a2...,an}&#xff0c;找出連續非空子串{ax,ax1,...,ay}&#xff0c;使得該子序列的和最大&#xff0c;其中&#xff0c;1<x<y<n。 輸入 第一行是一個…

學習進度條

學習進度條 周次 學習時間 新編寫代碼行數 博客量&#xff08;篇&#xff09; 學到知識點 第一周 160 0 1 github的使用和認識軟件工程這門課的價值。 第二周 160 130 3 復利的計算和Github的一些簡單操作還有就是進行項目的開發分析&#xff0c;還有就是對…

ARM基礎

1.  將32位a的【7&#xff1a;4】改成0101 -> a a&(~(0xF << 4)) | (0x5 << 4)&#xff1b; 2.  32位&#xff1a;單次處理數據32位。 3.  對于CPU而言&#xff0c;一切皆內存&#xff1b; 4.  DMA總線&#xff1a;不經過CPU直接在內存和內存間交換…

使用Jolokia和JMX進行客戶端服務器監視

Java監視工具的選擇非常廣泛&#xff08;由Google提供的隨機選擇和順序&#xff09;&#xff1a; javamelody 壓力探頭 JVisualVM 控制臺 賈蒙 Java JMX Nagios插件不適用 此外&#xff0c;還有各種專用工具&#xff0c;例如ActiveMQ &#xff0c; JBoss &#xff0c; Qu…

圖書管理系統數據字典_2. 結構化——數據字典

返回目錄&#xff1a;Chilan Yuk&#xff1a;軟件工程分析設計圖庫目錄?zhuanlan.zhihu.com一、基本知識用于定義數據流和數據存儲的結構&#xff0c;并給出構成所給的數據流和數據存儲的各數據項的基本數據類型。數據字典中應該包括關于數據的如下信息一般信息&#xff08;名…

HDOJ 5184 Brackets 卡特蘭數擴展

既求從點(0,0)僅僅能向上或者向右而且不穿越yx到達點(a,b)有多少總走法... 有公式: C(ab,min(a,b))-C(ab,min(a,b)-1) /// 折紙法證明卡特蘭數: http://blog.sina.com.cn/s/blog_6917f47301010cno.html Brackets Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65…

010-python基礎-數據類型-字符串操作

1、移除空白 1 username.strip() 2、分割 1 names "alex,jack,rain" 2 names_1 names.split(",") #  字符串分割之后變成列表 3 print(names_1) 4 #輸出 5 [alex, jack, rain] 3、合并列表各元素成為字符串 1 names_1 [alex, jack, rain]2 names_2…

重復次數最多的 子串_每日算法系列【LeetCode 424】替換后的最長重復字符

題目描述給你一個僅由大寫英文字母組成的字符串&#xff0c;你可以將任意位置上的字符替換成另外的字符&#xff0c;總共可最多替換 k 次。在執行上述操作后&#xff0c;找到包含重復字母的最長子串的長度。示例1輸入&#xff1a; s "ABAB", k 2 輸出&#xff1a; …

python基礎(一)簡單入門

一.第一個python程序 1.交互式編程 直接在命令行里面輸入python即可進入python交互式命令行&#xff0c;linux下一樣&#xff1a; 在 python 提示符中輸入以下文本信息&#xff0c;然后按 Enter 鍵查看運行效果&#xff1a; 2.腳本式編程 把代碼都寫到文件里面&#xff0c;然后…

VS2015 python

http://pgqlife.info/2015/05/05/VS-Python/ 配置文檔轉載于:https://www.cnblogs.com/itdef/p/5262712.html

了解Java弱引用

我最近沒來得及關注該博客&#xff0c;最重要的是&#xff0c;我沒有為與技術界的所有人保持聯系而致歉。 我最近偶然發現了Java 1.2以來提供的java.lang.ref包&#xff0c;但具有諷刺意味的是&#xff0c;幾天前我才知道它。 在瀏覽了幾篇有關各種引用類型和java doc的文章時&…

unbuntu 啟動任務腳本_Ubuntu下服務啟動腳本編寫

像Nginx、MySQL等服務一樣&#xff0c;在后臺運行自己編寫的抓取天氣信息的Python腳本。1.以管理員權限新建一個服務腳本文件sudo vim /etc/init.d/weather_service2.用下列模板修改該服務腳本文件#!/bin/bash### BEGIN INIT INFO## Provides: weather_service# Required-Start…

iOS開發工具——網絡封包分析工具Charles

作者 唐巧 發布于 2013年12月9日 | 1 討論 分享到&#xff1a;微博微信FacebookTwitter有道云筆記郵件分享稍后閱讀我的閱讀清單簡介 Charles是在Mac下常用的截取網絡封包的工具&#xff0c;在做iOS開發時&#xff0c;我們為了調試與服務器端的網絡通訊協議&#xff0c;常常需要…

Java Web托管選項流程圖

我經常被問到的一個問題是在何處以及如何托管Java Web應用程序。 可以在帶有嵌入式服務器的Eclipse中創建它很好&#xff0c;但是如何將它帶給人們呢&#xff1f; 長期以來&#xff0c;對于發燒友的程序員一直沒有答案。 只有昂貴和超大型的選擇。 事情最近變了&#xff0c;但這…

查找出系統中大于50k 且小于100k 的文件并刪除。

查找出系統中大于50k 且小于100k 的文件并刪除。 [rootxusx xxx]# ll -lhtotal 624K-rw-r--r-- 1 root root 576K Nov 30 21:39 1.txt-rw-r--r-- 1 root root 48K Nov 30 21:40 2.txt [rootxusx xxx]# find ./ -type f -size 1k -a -size -100k ./2.txt 轉載于:https://www.cnb…

vb.net mysql存儲圖片_怎么讓VB.NET 上傳圖片到SQL 數據庫只保存路徑,圖片保存到文件...

我的前臺代碼dimCoonAsSqlClient.SqlConnectiondimRsAsNewSqlClient.SqlCommandRs.ConnectionCoonRsNewSqlClient.SqlCommand("上傳圖片",Coon)Rs.CommandTypeCommandType.StoredPr...我的前臺代碼 dim Coon As SqlClient.SqlConnection dim Rs As New SqlClient.Sql…

[國嵌攻略][132][串口驅動實現]

如何開發Linux驅動程序 一般情況下都會有現成的驅動程序&#xff0c;不需要從零開始開發驅動程序。所以Linux驅動開發主要分為兩個步驟&#xff1a;1.讀得懂驅動程序&#xff1b;2.寫的了核心功能。 發送中斷處理程序 發送中斷處理函數在/drivers/serial/samsung.c的s3c24xx_se…

使用Regions ADF 11g進行Master Detail CRUD操作

你好 此示例演示了如何使用Regions在表之間創建Master Detail關系。 區域的主要目的是可重用性的概念。 使用區域和有限的任務流&#xff0c;我們可以將頁面重用到許多其他頁面中&#xff0c;以保持相同的功能并采用更簡潔的方法。 下載示例應用程序。 在此示例中&#xff0c;…