作為嵌入式開(kāi)發(fā)者,已經(jīng)熟悉了C語(yǔ)言跟VS。推薦你也了解下C#,用來(lái)開(kāi)發(fā)上位機(jī)挺舒服。如果你仔細(xì)與其它語(yǔ)言比較,就會(huì)感覺(jué)到很香。
C#良好兼容了值類(lèi)型、引用類(lèi)型,在發(fā)展中逐步解決了其他高級(jí)語(yǔ)言沒(méi)解決好的問(wèn)題。很好的總結(jié)了前人的經(jīng)驗(yàn),在基礎(chǔ)語(yǔ)法上就區(qū)分了值類(lèi)型和引用類(lèi)型。對(duì)初次接觸編程的同學(xué)來(lái)說(shuō)這一點(diǎn)容易造成學(xué)習(xí)障礙,但是只要掌握了它,就會(huì)給實(shí)際工作帶來(lái)極大便利。
反觀歷史,C#也曾經(jīng)因?yàn)椤爸殿?lèi)型/引用類(lèi)型”飽受詬病,“拆箱”和“裝箱”一直是個(gè)招黑的設(shè)計(jì)。但后來(lái)我們看到,隨著泛型的成熟和普及,隨著泛型容器代替通用容器,裝箱和拆箱的問(wèn)題已經(jīng)在很大程度上解決了。
還有對(duì)異步的支持等等,C#的設(shè)計(jì)最初帶來(lái)了一些問(wèn)題,但是最終還是交上了一份滿意的答卷。
充分利用棧空間,非常高效,做了一部分C/C++擅長(zhǎng)的事。
值類(lèi)型有一大特點(diǎn),就是能充分利用棧空間。高級(jí)語(yǔ)言的GC特性一直飽受詬病,但下面的Unity常見(jiàn)代碼,運(yùn)行時(shí)沒(méi)有GC:
// 通過(guò)輸入的三維向量,移動(dòng)物體的位置void Move(Vector3 input){// 演示代碼,有意分成很多行 input = input.normalized; Vector3 move = input * 2.0f; move *= Time.deltaTime. transform.position += move; }
這段代碼沒(méi)有在堆上分配空間,你所看到的操作全都是在棧上進(jìn)行的,GC壓力為0。我認(rèn)為這是C#最令人驚艷的一點(diǎn)。
一般來(lái)說(shuō)數(shù)組長(zhǎng)度較長(zhǎng),默認(rèn)分配在堆上。但是C#也提供了便利的語(yǔ)法,在棧上分配數(shù)組,對(duì)項(xiàng)目后期優(yōu)化來(lái)說(shuō)簡(jiǎn)直是神技:
public void unsafe foo(){int* bar = stackalloc int [10];}
沒(méi)錯(cuò),C#依然保留了指針,但一般僅用于局部的unsafe代碼。在局部熱點(diǎn)可以完全解放性能。
良好的語(yǔ)法設(shè)計(jì)和庫(kù)函數(shù)設(shè)計(jì),引導(dǎo)程序員寫(xiě)出更快且更自然的代碼。
C#中最常用的容器List,也具有一些良好的設(shè)計(jì),當(dāng)然其它語(yǔ)言也有類(lèi)似的優(yōu)點(diǎn):
// 新建一個(gè)list,長(zhǎng)度為0。但在堆中預(yù)留10萬(wàn)個(gè)位置 List《int》 list = new List《int》(100000);// 加入很多元素,由于容量足夠沒(méi)有GCfor (int i=0; i《89000; i++) {list.Add(i); }// 用過(guò)以后清空l(shuí)ist,長(zhǎng)度變成0list.Clear();// 但容量還是10萬(wàn),繼續(xù)增加元素還是沒(méi)有GCfor (int i = 0; i 《 99000; i++) {list.Add(i); }
list在預(yù)留空間充足時(shí),添加元素不會(huì)產(chǎn)生GC。而且List和值類(lèi)型結(jié)合使用,在內(nèi)存占用上也有優(yōu)勢(shì)。當(dāng)然,很多其它語(yǔ)言也有類(lèi)似的設(shè)計(jì),可以說(shuō)別的語(yǔ)言做的好的部分,C#做的也一樣好。
繼承、泛型、接口、類(lèi)型約束等等高級(jí)特性,都有著良好且自洽的設(shè)計(jì)。
最初接觸C#的時(shí)候,看看int的原型,收獲很大:
public struct Int32 : IFormattable, IConvertible, IComparable, IComparable《Int32》, IEquatable《Int32》 {// 。..。 }
熟悉C++的人,經(jīng)過(guò)思考,可以很好的理解IComparable、IEquatable以及它們的泛型形式。同時(shí)也能猜出“Interface”的概念。思考C#的底層設(shè)計(jì),給人的感覺(jué)就是自然、規(guī)范、恰到好處。
總之,C#語(yǔ)言及其標(biāo)準(zhǔn)庫(kù)的設(shè)計(jì),非常值得借鑒和推崇。
C#的良好設(shè)計(jì)讓它有著越來(lái)越廣泛的應(yīng)用。有C語(yǔ)言基礎(chǔ)的朋友可以快速上手C#,適合開(kāi)發(fā)單片機(jī)的上位機(jī)。
編輯:jq
-
嵌入式
+關(guān)注
關(guān)注
5142文章
19553瀏覽量
315326 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7630瀏覽量
140517 -
代碼
+關(guān)注
關(guān)注
30文章
4891瀏覽量
70298
原文標(biāo)題:用C#開(kāi)發(fā)上位機(jī)挺舒服,文末送資料
文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
下位機(jī)CY7C68013A發(fā)送數(shù)據(jù),上位機(jī)C#讀取數(shù)據(jù),510字節(jié)一幀,會(huì)丟幀或者幀內(nèi)錯(cuò)位是怎么回事?
玩轉(zhuǎn)C#/LABVIEW,斯撩
STM32/GD32開(kāi)發(fā)板基本串口RS232\\RS485通信及CAN接口 usbhid升級(jí) U盤(pán)升級(jí) sd卡升級(jí)升級(jí)學(xué)習(xí)方案開(kāi)發(fā)板
C#基于Halcon實(shí)現(xiàn)Basler相機(jī)采圖
STM32F103上位機(jī)升級(jí),RS485升級(jí)、CAN升級(jí)
運(yùn)動(dòng)控制卡網(wǎng)絡(luò)通訊的心跳檢測(cè)之C#上位機(jī)編程

上位機(jī)編程語(yǔ)言選擇 上位機(jī)在自動(dòng)化中的作用
上位機(jī)系統(tǒng)架構(gòu)分析 上位機(jī)與下位機(jī)的區(qū)別
以太網(wǎng)IO控制卡:C#實(shí)時(shí)讀寫(xiě)時(shí)間測(cè)試

Labview上位機(jī)軟件開(kāi)發(fā)
學(xué)習(xí)QT開(kāi)發(fā)上位機(jī)記錄--(1.工具記錄篇)

PCIe實(shí)時(shí)運(yùn)動(dòng)控制卡的雙盤(pán)視覺(jué)篩選機(jī)上位機(jī)開(kāi)發(fā)應(yīng)用

評(píng)論