播下中俄世代友好的種子_網頁設計公司

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

  一月十八日,“歡樂春節”活動走進莫斯科五一村中共六大會址常設展覽館。圖為俄羅斯小朋友正在觀看中國民俗及傳統手工藝展。
  本報記者 屈 佩攝

  透過雲朵,一縷縷陽光灑向莫斯科的街道,給冬日的城市帶來暖意。1月18日,位於莫斯科近郊五一村的中共六大會址常設展覽館張燈結綵,喜氣洋洋,一場別開生面的“歡樂春節”新春聯誼會在此舉行。此次活動由莫斯科中國文化中心、五一村政府、“靈感”現代藝術畫廊共同舉辦,不少當地少年兒童在家長的陪伴下來到這裏體驗中國年。

  大門上方的紅燈籠、牆上懸挂的中國結和中國書畫作品讓濃濃的中國年味兒撲面而來。中國駐俄羅斯大使館文化參贊、莫斯科中國文化中心主任龔佳佳向大家介紹說,中國農曆新年又叫“春節”,意味着春天正在到來。對於中國人來說,這是一年中最重要的節日,人們從四面八方趕回家,和親人團聚。

  中國民俗及傳統手工藝展是活動的重要組成部分,吸引了眾多來賓的目光。策展人伊琳娜·扎哈羅娃曾在中國生活多年,現場展品基本都由她提供,有中國民間手工藝品、十二生肖剪紙以及民間布藝老虎、兔子、馬等玩偶,也有俄羅斯兒童以放鞭炮、貼春聯、看燈會等為主題創作的反映中國春節文化習俗的粘貼畫等。

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

  在扎哈羅娃的示範下,孩子們有的剪窗花,有的製作生肖形象的貼紙和明信片。扎哈羅娃還向孩子們繪聲繪色地講起了關於十二生肖的中國民間傳說,以及十二生肖中體型最小的老鼠為什麼能排第一名。孩子們聽得津津有味。“誰知道即將到來的中國農曆新年——春節是哪一天?”“就是今天。”面對扎哈羅娃的提問,一個孩子不假思索地回答。另一個孩子立即糾正說:“是1月25日。”

  隨後,扎哈羅娃又拿出大紅的“福”字,問孩子們這個漢字是什麼意思。“幸福!”有孩子高聲喊道。她又把“福”字倒過來問道:“把‘福’字倒貼,這又是什麼意思呢?”這下可難倒了這群可愛的孩子們。扎哈羅娃耐心地解釋:“這是幸福到來的意思,因為漢語里‘到’和‘倒’發音是一樣的。”孩子們聽后恍然大悟。

  活動當天,莫斯科“人類”劇院的演職人員還為大家表演了話劇《灶王爺的故事》。劇本的創作受到扎哈羅娃撰寫的《中國民間傳說故事》的啟發。演員們用詼諧語言演繹的中國神話故事讓孩子們沉浸其中。

  扎哈羅娃對本報記者表示,俄羅斯孩子對漢語和中國童話故事很感興趣,中國孩子對俄羅斯童話《漁夫和金魚的故事》、民歌《卡林卡》也很喜歡。“讓俄中兩國少年兒童了解彼此國家的文化,會播下兩國世代友好的種子。”

  (本報莫斯科1月20日電)  

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

“透過園林和建築藝術感知文化”_台北網頁設計

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

  圖為一位遊客沿步行大道遊覽拉查帕皇家花園。 
  拉查帕皇家花園供圖

  核心閱讀

  2006年舉行的清邁世界園藝博覽會是東南亞地區歷年來規模最大的園藝展之一。世園會閉幕後,園區引入了更多植物種類,興建專業展館,成為重要的旅遊景點和園藝教學基地。保留完好的國家館展示世界各地的風情,讓遊客感受不同地區園林文化,也為園藝研究人員提供了學習樣本

  

  站在泰國清邁西南的素貼山上,可以將拉查帕皇家花園的風光盡收眼底。花園被一片青翠的密林覆蓋,泰式建築風格的金色尖頂星星點點掩映其中,在陽光下熠熠生輝。極目遠望,還能看到園內來自不同國家、風格迥異的園林建築。

  拉查帕皇家花園是2006年清邁世界園藝博覽會的舉辦地。近年來,花園不斷拓展職能,成為集觀賞、科研、休閑為一體的多功能園區,源源不斷地吸引着各國遊客前來参觀。

  留住奼紫嫣紅,讓遊客了解泰國美麗風情

  進入拉查帕皇家花園,一條西北—東南走向、筆直寬敞的步行大道串聯起數個人工噴泉和藝術雕塑,通向遠方素貼山腳下的泰國王室建築群。大道兩側遍布着規模不等的植物園。植物園內,生長在不同氣候環境下的熱帶雨林植物、沙漠植物、森林植物應有盡有。大道的東北方向,林立着世園會期間各國在此建設的國別館,從中仍然可以看出當年世園會的盛況。

  泰國地處熱帶。為展示更多種類的植物,清邁世園會選擇在氣候較為溫和的冬季舉行,從2006年11月1日持續到2007年1月31日。展覽期間,園區內共引入2200多種植株,吸引了近300萬遊客前來参觀,是東南亞地區歷年來規模最大的園藝展之一。

  世園會閉幕後,園區內留下了數十座主題花園,幾十棟建築物和上百萬株植物。為留住當年的奼紫嫣紅,泰國政府斥巨資對園區進行整修,於2008年5月1日再次向公眾開放。園區原本屬於清邁皇家農業研究中心,重新開放后更名為拉查帕皇家花園。

  整修后的園區總面積188畝,分為泰國王室建築群、世園會期間建設的國別館和植物園三大部分,不僅保留了世園會期間引入的全部草木,還增加了新的植物品種。目前園區內各類植物共有超過3000種。由於一些特色植物觀賞期較短,花園一直在增添能連續生活兩年以上、觀賞期長的植物品種,併為不同屬類的植物建立單獨的展館。

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

  如今,拉查帕皇家花園的遊客數量以每年4%—5%的速度遞增,已成為泰國的一張“旅遊名片”。與其他景區相比,拉查帕皇家花園的門票價格並不高,外國遊客僅需支付200泰銖(約合46元人民幣),本國遊客價格減半。“我們不想通過提高門票價格來增加收入。花園對外開放並非以贏利為首要目的,而是讓更多遊客有機會回望當年世園會的盛況,了解泰國的美麗風情。” 園區公關部經理段蘭書說。

  為職能做加法,讓遊客收穫知識和健康

  2008年,泰國政府將花園規劃為泰國的農業研發中心和園藝學習中心,為其今後的發展確立了方向。此後,花園不斷加強與研究機構合作,為園區職能做加法。

  近年來,園區和清邁皇家理工大學開展合作,在生物多樣性、高原農業、泰國農作物等多領域聯合展開學術研究。園區主要負責提供實驗場地並支持研究成果的生產應用。此外,園區還經常通過舉辦講座、公開課等形式,向民眾介紹泰國的農業項目,傳播園藝、植物等農業知識。

  位於園區北部的新概念農業園是園區的一大亮點。農業園內展示着泰國最新的農業技術和設施,包括蓄水灌溉設施、水稻種植等。在一片水稻種植示範區,農業園的工作人員正在給一群前來参觀的清邁小學生講解泰國水稻種植的歷史。孩子們雙手扒着圍欄,好奇地看着一株株果實飽滿的水稻,時不時举手提問。“泰國是農業國家,學生應當掌握基本的農業常識。孩子們在這裏學到了許多書本以外的知識,激發了他們對農業的興趣。”一位帶着學生前來参觀的老師告訴記者。

  花園還利用自身環境優勢,致力於向民眾推廣健康的生活方式。園區公關部職員平采諾介紹,園區從2018年7月開始舉辦“綠色生活 快樂跑步”活動,鼓勵民眾鍛煉健身。每周五傍晚6時以後,園區免費對外開放,並組織前來的清邁市民和各國遊客進行慢跑,增添了園區的人氣。“每周五晚上都會有近千人慕名前來,來這裏跑步已成為許多清邁市民的習慣。”平采諾說。

  保留國家展館,讓遊客感受不同的文化

  走進國別館展區,犹如走進了“微縮版”的世界公園:帶有人造山丘的日式庭院、米南加保族風情的印度尼西亞牛角屋、被鬱金香層層“簇擁”的荷蘭風車……世界各國的代表性建築匯聚於此,展示着多彩的異國風情。在國別館內部,盛開着各自國家的代表花卉,來自世界各地的遊客循着花朵的香氣找尋自己國家場館的蹤跡。

  “最吸引遊客的不只是植物,還有各國建築,尤其是當年世園會保留下來的各國園林。”段蘭書說。據他介紹,由於國別館的養護耗資不小,園區採取了重點維護的策略,在當年開放的50多個國別館中保留了22個最具特色的場館,場館內的物品擺設、一草一木都維持原貌。來自清邁周邊南奔府的緹拉蓬女士曾於世園會期間参觀過這裏的國別館展區。多年後再訪,她驚嘆於場館的維護:“留下的國家展館幾乎沒有變化,時間就像靜止了一樣。”

  在園區內,記者遇到了英國遊客拜爾德。他騎着租來的自行車,背着相機,在國別館集中的區域沿小路穿行,遇到感興趣的場館,便停車觀賞。拜爾德說:“不同的植物和建築承載着不同國家和地區的文化。透過園林和建築藝術感知文化,這讓拉查帕皇家花園對各界民眾充滿吸引力。”

  保存完好的國別館不僅為遊客提供鑒賞不同地區園林文化的機會,也為研究人員提供了學習的樣本。這裏每年都有眾多來自世界各地的園藝工作者,包括世園會舉辦國的工作人員,組團來到拉查帕皇家花園考察學習,舉辦研討會等活動。拉查帕皇家花園的一草一木,一磚一瓦,都為各國的園藝愛好者、工作者提供了交流學習的一方天地。

  (本報清邁電) 

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

中山公園音樂堂春節演出開幕_網頁設計公司

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

本報北京1月21日電  (記者張明瑟)2020年中山公園音樂堂春節系列演出近日開幕。本次活動由北京中山公園音樂堂主辦,自1月11日起至2月16日,共進行10場農曆春節相關主題演出。

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

系列演出主題分別為“春天你好”“國韻華音”“紅色經典”“共和國之戀”等,涵蓋童聲合唱、京劇、相聲、打擊樂、曲劇等多種藝術形式。該系列首場演出為北京愛樂合唱團演出的“春天你好”音樂會,以童聲合唱形式演繹《唱臉譜》《春姑娘,你在哪裡》等經典兒童歌曲。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

國外神人成功將整部史瑞克電影,壓縮放進一張 3.5 磁碟片中,還能播放觀看_台中搬家公司

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

把一個大容量檔案,壓縮到非常的小已經不是什麼特別新聞,去年就有人製作出一個 46MB 的炸彈壓縮檔,解壓後會變成 4.5PB 炸裂硬碟空間,但如果這檔案是影片,且壓縮之後也必須能正常播放,那難度就高了,最近就有一位網路神人成功把整部史瑞克動畫電影,壓縮放入 3.5 磁碟片,你沒看錯,就是那容量只有 1.44MB 的 3.5 磁碟片,而且真的可以播放,不過畫質變很差。

國外神人成功將整部史瑞克電影,壓縮放進一張 3.5 磁碟片中

最近在國外 Reddit 論壇上,一位 GreedyPaint 網友分享他成功打造一台可播放 3.5 磁碟片的機器,他稱作「LimaTek Diskmaster」,這台是使用 Raspberry Pi 平台製成。而為了讓電影可以壓縮到 3.5 磁碟片中,他也開發一個 x265 影片編碼器,可將電影壓縮至 120×96 解析度並以每秒 4 張(4 FPS)的方式播放:

最後就成功把近 90 分鐘的史瑞克動畫電影塞進這 1.44MB 的 3.5 磁碟片中,作為比較,目前最常見的電影 DVD 格式,儲存容量皆高達 4.7GB,即便是使用 iPhone 12 Pro 以 ProRAW 格式拍照,一張也要 25~40MB 的大小,由此可見這 1.44MB 有多麼小:

當然,只能以 120×96 解析度與 4FPS 播放,畫面絕對是慘不忍睹,不僅畫質差,還會頓頓的,聲音部分雖然也有,畢竟被大幅壓縮過,音質也有一點慘:

這部影片成功之後他也表示,會再嘗試看能不能把電影放進黑膠唱片中,真的不得不佩服這些開發者的想法,看似對現代來說好像沒用,但他們依舊會想繼續驗證下去。

另外這位開發者有一點也蠻用心,不只製作出 3.5 磁碟片的電影播放器,連開頭動畫都有,要求觀賞者插入 3.5 磁碟片:

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

有興趣看完整影片的人,可以點我至 Reddit 論壇的討論串。

補充資料:Reddit

日本網友異想天開使用民間散熱法 + 散熱片幫 MacBook 散熱,結果螢幕不小心蓋上整個毀了

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

Starlink 衛星網路國外影片開箱與速度實測,安裝容易、下載速度最快達到 180Mbps_網頁設計

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

Starlink 衛星網路在國外已經陸續送到符合測試資格的用戶家中,雖然台灣基本上應該是不需要,而且也不知多久才有可能進來,但相信不少人對於這產品都相當有興趣,究竟實際使用的速度表現如何?安裝容不容易?而前幾天就有人拍攝開箱與實測影片,並分享到 YouTube 上,整體看起來真的很不錯,下面整理給大家。

Starlink 國外影片開箱與速度實測

Starlink 目前還處於 Beta 測試階段,只有開放給偏鄉的普通用戶,月費為 99 美元,約台幣 2,780 元(價格不便宜)。根據統計,截至 11 月已經完成 16 次衛星發射任務,目前在軌道上的衛星數量共有 860 顆,已經超越 Starlink 先前提過覆蓋全美的 720 顆,至於全球,則需要 1,800 顆。

近日一名網友,在自己的 Northwoods Odds and Ends 頻道中,分享他收到 Starlink 的開箱與速度實測影片,長達 16 分鐘,文末我會附上完整影片,下面就簡單介紹幾個重點。

他收到 Starlink 共有兩盒,有一個特別大,另一個看起來像是配件與說明書的小盒子:

小盒打開之後果然是配件箱(底座),還有說明書:

大盒打開當然就是接收衛星訊號的主體,另外還有隨附的 Starlink 路由器(下方白銀那一台):

這個衛星接收器有內建網路線,而且非常長一條,從戶外接到室內沒問題:

而安裝位置有很多種方式,這位用戶他是裝在屋頂上,下方還另外加裝延長管,讓接收器可以更靠近天空一點,來提升訊號強度。他也提到,Starlink 隨附的連接管,基本上可跟任何管子相容:

底部就鎖在屋頂上方:

一開始會需要一點時間讓接受器找到衛星訊號:

網路線部分,他就從旁邊的小窗進到屋內:

其長度可以一直延伸到房子另一側的地下室:

接收器的網路線是連接到電源變壓器上,然後再用另一條網路線,從另一邊的孔接出:

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

然後連到 Starlink 路由器上,這台只有兩個網路孔,因此另一條他再接到自己的路由器:

如下圖所示,這些網路線分別接到自己的其他網路設備與智慧家庭裝置:

速度實測方面,下圖背景是他打開可查看衛星位置的網頁,他的家位於綠色圈圈內,意味著訊號不錯,測試出來下載也確實高達 126.13Mbps,上傳 23.68Mbps:

他還測試多次,都有超過 100Mbps,甚至還看到 180Mbps 的下載速度:

不過有時候連到另一顆衛星,速度就有可能會下降:

下方完整影片。從這結果來看,Starlink 真的很讓人期待阿!無論是速度還是安裝易度都很不錯,對於那些住在偏遠地區的人,終於有機會享受到高速上網體驗,希望能趕快向全球推出(原本影片被砍了,換另一個開箱影片):

還可以玩聯網遊戲:

馬斯克全球衛星通信夢不是隨便說說, SpaceX「星鏈(Starlink)」試營運中!

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

「 Boston Dynamics」機器人公開跳舞影片 靈活動作接近真人_貨運

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

致力發展具有腿部人形機器人的波士頓動力(Boston Dynamics),為了迎接新的一年而集結公司旗下Atlas、Spot 和 Handle等各種類型的機器人與機器狗,推出一支「Do You Love Me?」的影片,其中Atlas人形機器人的擬真動作,也吸引許多人的討論。

「 Boston Dynamics」機器人公開跳舞影片 靈活動作接近真人

 

提到跟人類無異的機器人,很多人大概都會聯想到電影題材,像是經典的《魔鬼終結者》系列、《機械公敵》等,不過隨著波士頓動力最新的機器人影片公開,似乎又朝著電影實現更進一步。

 

在波士頓動力先前一支「More Parkour Atlas」的影片中,已能看到Atlas人形機器人開始能加自然的做出人類動作,像是原地跳起來旋轉、後空翻等。

▲圖片來源

 

 

而在「Do You Love Me?」的影片中,可以看到先從Atlas人形機器人獨舞,接著變成兩位Atlas人形機器人,接著再加入Spot 機器狗和 Handle 輪滑機器人,還有Atlas人形機器人與Spot 機器狗搭配等。

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

 

除了Atlas人形機器人的姿態越來越自然,而且腳步跟手部的動作能越做越細微外,最讓人驚呀的是配合音樂,你會很自然的覺得這真的是機器人跟著音樂跳舞,說不定有的人跳得還沒他們好。

 

這支影片在12月29日公開後,30日觀看次數已達到了308萬而且持續增加中,也許我們不需等到鋼彈先出現,擬真的人型機器人大概就會先運用在生活中了。

 

圖片來源自「Do You Love Me?」影片

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

DXOMARK 公佈 2020 年智慧型手機最佳相機、最佳自拍、最佳錄音、最佳音效播放榜單_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

近年智慧型手機的相機性能的提升,已經能成為民眾日常記錄生活拍照、錄影的隨身相機,而相機的表現也是多數消費者在選購新手機重要的選擇因素之一。 DXOMARK 每年都會評測大量智慧型手機的相機表現並給予評分,也成為消費者、手機品牌作為參考依據。在 2020 年的最後一天, DXOMARK 依據拍攝目的彙整了今年表現最佳的智慧型手機相機。

DXOMARK 公佈 2020 年智慧型手機最佳相機、最佳自拍、最佳錄音、最佳音效播放榜單

許多旗艦級手機在發表後,消費者除了關注硬體規格和售價,也同時會期待專業相機評測網站 DXOMARK 的評測會給予什麼樣的評價,也有不少旗艦機種會將 DXOMARK 的相機評測成績作為宣傳自家手機的一大賣點。在 2020 年, 華為 Mate 40 Pro+ 再次刷新了智慧型手機的總分 139 分稱冠,然而針對不同的拍攝、使用需求, Mate 40 Pro+ 其實也不是唯一選擇。

2020 年智慧型手機最佳主相機

最佳拍照:華為 Mate 40 Pro+

華為 Mate 40 Pro+ 在拍照部分各項表現都相當出色,也毫無疑問取得了「最佳拍照」的肯定。 DXOMARK 拍照分類更取得 144 分的佳績,尤其是夜間拍攝表現出色,也是迄今為止夜拍的最佳成績。此外,動態範圍在極弱光線環境下也優於其他手機,拍攝夜景的細節和噪點也取得良好平衡。
(其他推薦:Apple iPhone 12 Pro)然而,對於中國以外的消費者要入手 華為 Mate 40 Pro+ 不太容易,因此 DXOMARK 也同樣推薦 iPhone 12 Pro 系列。雖然在部分測試項目不如 Mate 40 Pro+ ,不過 iPhone 12 Pro 系列在自動對焦、預覽方面相當出色,搭載 LiDAR 光學雷達掃瞄儀可在所有光線環境下準確地對焦。

最佳錄影:華為 Mate 40 Pro

錄影方面, 華為 Mate 40 Pro 在 DXOMARK 錄影測試取得 116 分的佳績,在任何條件下都可錄製豐富的細節、極少的噪點,色彩演色性和擁有可靠的白平衡。自動對焦準確、可靠的錄影防手震,作為室內外的動態錄影使用都相當理想。
(其他推薦: Apple iPhone 12 Pro Max)iPhoen 12 Pro Max 在錄影拍攝方面取得 113 分的成績名列該分類第二名,雖然各屬性的得分都略低於 Mate 40 Pro 不過差距微乎其微, iPhone 12 Pro Max 同樣能在任何情況下錄製高品質的影片。加上支持杜比視界(Dolby Vision)的拍攝,其動態範圍也令人印象深刻。

最佳夜拍:華為 Mate 40 Pro+

華為 Mate 40 Pro+ 除了一般拍照表現出色,上述也有提到它的夜拍表現是他的強項之一。
(其他推薦:華為 P40 Pro、小米 10 至尊紀念版)夜間拍照方面,華為 P40 Pro 和小米 10 至尊紀念版都取得 72 分的夜景拍攝成績名列第二,在極若光線和夜間拍攝時都可提供出色的畫質。

最佳散景:華為 Mate 40 Pro / 三星 Galaxy S20 Ultra

散景模式方面,華為 Mate 40 Pro 和三星 Galaxy S20 Ultra 均獲得 75 分。 Mate 40 Pro 的人像模式可生成非常自然的散景模擬效果、膚色和曝光都表現不錯,而 S20 Ultra 的散景照片也可呈現精準的曝光度、鮮豔色彩、寬廣動態範圍和戲界。

最佳望遠鏡頭:小米 10 至尊紀念版(小米 10 Ultra)

針對有遠景拍攝需求的用戶,小米 10 至尊紀念版在望遠鏡頭取得 133 分成為重視望遠變焦拍攝者的首選。
(其他推薦:華為 Mate 40 Pro+、 OPPO Finde X2 Pro 和 vivo X50 Pro+)

最佳超廣角鏡頭:小米 10 至尊紀念版(小米 10 Ultra)

小米 10 至尊紀念版在廣角方面取得 53 分,除了提供等效焦距 12.5mm 最寬闊的視野,在畸變和其他圖像的偽像都控制得宜。
(其他推薦:華為 Mate 40 Pro+)

2020 年最佳自拍手機

近年,許多消費者在選購手機相當重視相機自拍的表現,無論是自拍照片或影片進行生活記錄,而 DXOMARK 也選出了幾款 2020 年最佳自拍手機。

最適合用來自拍照片手機:華為 Mate 40 Pro

華為 Mate 40 Pro 在前相機不僅名列自拍評測取得第一名,也在拍照方面獲得 110 分拔得頭籌。在低光環境下也能呈現良好的臉部曝光和寬廣的動態範圍、色彩討喜、低光環境也具有良好的白平衡。
其他推薦:華為 P40 Pro 、 nova 6 、華碩 ZenFone 7 Pro 、三星 Galaxy S20 Ultra、 Galaxy Note 20 Ultra)

最適合用來自拍錄影的手機:華為 Mate 40 pro / 華為 ZenFone 7 Pro

在自拍錄影類別華為 Mate 40 Pro 再次奪冠,而華碩 ZenFone 7 Pro 也並列了第一位,兩款手機在自拍錄影測試都取得出色的 96 分。 Mate 40 Pro 在 4K@30fps 的測試條件下表現最優秀,而翻轉三鏡頭的 ZenFone 7 Pro 一樣在 4K@30fps 影像表現出色,甚至能拍攝 8K 錄影。
(其他推薦:華為 P40 Pro 、三星 Galaxy S20 Ultra 和 Galaxy Note20 Ultra)

2020 年最佳音效播放和錄音手機

DXOMARK 在一年多前加入了音效評測分類,針對智慧型手機的揚聲器播放和錄製收音進行評測。以下也針對音效和收音這兩部分選出了 2020 年的最佳手機。
(*小提醒:以下 DXOMARK 的推薦名單僅針對手機「音效/錄音」的評測結果進行推薦,不涉及其螢幕和錄影的畫面表現。)

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

聽音樂和 Podcast (音效)最佳選擇:小米 10 Pro

看電影和電視劇(音效)最佳選擇:OPPO Find X2 Pro

遊戲(音效)最佳選擇:華碩 ROG Phone 3

錄製生活影片(收音)最佳選擇:榮耀 V30 Pro

自拍錄影(收音)最佳選擇:Apple iPhone 12

錄製現場音樂會最佳選擇:Apple iPhone 12 SE(2020)

語音備忘錄和錄音最佳選擇:華為 P40 Pro

圖片/消息來源:DXOMARK (1) (2) (3)

延伸閱讀:
MKBHD 公布 2020 年度智慧型手機獎 ,年度最佳手機獎落誰家?

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

從 React 架構開始講解 useState、useEffect 編程設計_網頁設計公司

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

隨着前端開發複雜度增加,原生開發模式顯得越來越笨重,前端框架也層出不窮。

MVC 和 MVVM

MVC

MVC是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面显示分離的方法組織代碼,將業務邏輯聚集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不需要重新編寫業務邏輯。MVC被獨特的發展起來用於映射傳統的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結構中。

  • Model(模型):數據。
  • View(視圖):用戶界面。
  • Controller(控制器):業務邏輯。

MVVM

MVVM是Model-View-ViewModel的簡寫。它本質上就是MVC 的改進版。MVVM 就是將其中的View 的狀態和行為抽象化,讓我們將視圖 UI 和業務邏輯分開。

採用雙向綁定(data-binding):View的變動,自動反映在 ViewModel,反之亦然。

React Component class編程

React 是一個 用於構建用戶界面的 JavaScript 庫,注重於 View 層。

React Component 並沒有嚴格的M,V區分,只是模糊的定義了幾塊內容:

  • state: 數據存放
  • render: 用戶界面
  • setState | forceUpdate: 渲染用戶界面

所以我們的代碼邏輯是這樣的:

  1. 定義state
  2. 根據state編寫render
  3. render中加入事件,修改state,且渲染用戶界面

以上1,2兩步完成后,我們就不再需要關心render,因為render依賴state,我們只需要關心如何修改state,然後需渲染時,setState | forceUpdate就可以了。

生命周期 componentDidMount 也是很重要的,它再組件完成后只執行一次, 可以用於請求數據,然後設置state。

渲染頁面(setState):state -> view。

書寫思路清晰的代碼,要清晰的知道數據的流向,我們這樣設計。

  • 初始化階段:框架自動渲染一次 -> componentDidMount -> 手動渲染
  • 用戶操作:操作 -> 修改state -> 手動渲染

總結:寫好render和state對應的規則后,只需要專心與如何修改state,然後執行渲染即可。

例子:列表請求

請求與請求參數的分離也是代碼清晰程度的重要一部分。

setState最重要的還有第二個參數,是設置成功后的回調函數。React的state可以讓我們專心開發某一塊,例如我們寫一個列表

state = {
  page: 1,
  dataList: null,
}

// 請求列表
fetchDataList = () => {
  const { page } = this.state;
  let data = '通過page參數請求得到的數據';  // 通過請求得到數據
  this.setState({ dataList: data });
}

// 翻頁
handlePageChange = (page) => {
  this.setState({ page }, this.fetchDataList);
}

寫一個請求方法,請求得到的參數完全從state中獲取,得到數據後會setState渲染頁面,所以我們只需要專心致志於設置state,在回調中發送請求。這樣,一切都看起來那麼清晰。

特殊使用

由於 state 是引用類型,所以我們可以使用 this.state.xx = xx 來修改數據,React 官方並不推薦此種修改方式,因為此方法並沒有渲染頁面,並不能直接的感受到數據的變化。

了解了 React 渲染機制后,只要清晰我們再做什麼,也可以使用此種方法修改數據,並且大量能減少代碼量。

例如:頁面上有兩個按鈕,一個按鈕記錄此按鈕點擊次數,另一個按鈕點擊后,才會显示第一個按鈕的點擊次數。

使用常規setState方式,需要兩個變量計數。

state = {
  clickCount: 0;
  viewCount: 0;
}

btn1Click = () => {
  this.setState({clickCount: this.state.clickCount +1 });
}

btn2Click = () => {
  this.setState({viewCount: this.state.clickCount });
}

render() {
  return <div>{this.state.viewCount}</div>
}

如果使用隱士賦值,只需要一個變量,並且再需要渲染的時候手動渲染。

state = {
  count: 0;
}

btn1Click: () => {
  this.state.count++;
}

btn2Click: () => {
  this.forceUpdate(); // 強制渲染 相當於 this.setState({})
}

render() {
  return <div>{this.state.viewCount}</div>
}

當然,這種方式要在對 React 渲染機制清晰后再使用。

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

這就體現了React的靈活性,按需渲染。

React Hooks 函數式編程

React 16.7推出了 React Hooks 函數式編程。不用傳統的類方式,寫法大有不同。

首先看渲染機制,Component方式,渲染后,只執行了render方法,類裏面的其他方法不會執行。而 React Hooks 函數式編程 每次渲染,都會把整個函數執行一遍,並提供了一個數據存放地 useState。

useState

// 聲明一個叫 "count" 的 state 變量
const [count, setCount] = useState(0);

setCount 用來設置 count 並且渲染頁面,且只有這一種渲染方式,這就意味着,我們不能像 Component 那樣靈活的按需渲染了。

useEffect

useEffect(function () {
  // do sth..
}, [])

useEffect 第一個參數是一個函數,滿足條件後會觸發。第二個參數是個數組,如果是個空數組則只執行一次第一個參數函數(相當於componentDidMount),如果裏面放變量,執行一次后,以後每次渲染后就監聽變量有沒有改變,如果改變就執行第一個函數。

與 class 方式的對比

對比 React.Component 和 React Hooks,它們都有存放數據的state,通過state渲染頁面的render,和手動渲染的方法setState或者setXXX。

不同的是,React.Component有setState成功后的回調,React Hooks沒有。

例如使用 React Hooks 執行下面代碼

setCount(2);
console.log(count);

count拿到的總是設置前的值。

useState、useEffect代碼設計

看到知乎上一句話:先做什麼再做什麼這種callback的寫法是傾向於命令式,而使用hooks編寫代碼則更傾向於聲明式.你不需要去指定你要的動作發生的時機, 而是聲明一個條件或者依賴來讓React來決定正確的執行時間點。

所以我們要轉變思路,不要去控制何時渲染頁面,因為每一次set都會渲染頁面,需要的是在useEffect里寫條件,讓React自己決定渲染。

如請求改造如下

const [page, setPage] = useEffect(1);          // 請求參數 page
const [pageSize, setPageSize] = useEffect(20); // 請求參數 pageSize
const [type, setType] = useEffect(1);          // 請求參數 type
const [dataList, setDataList] = useEffect(1);  // 請求得到的數據

useEffect(function () {
  fetchDataList();
}, [page, pageSize, type]);

const fetchDataList = function () {
  let data = '通過page pageSize type請求到的數據';
  setDataList(data);
}

組件第一次執行或者page,pageSize,type改變,就會請求數據,然後set新數據渲染頁面。

上面代碼基本上滿足了我們需要,然後在極端情況下,即使請求參數改變,也不需要發請求。對此我們需要另外設置一個變量控制是否發請求。

const [sendRequest, setSendRequest] = useEffect(0);  // 控制發請求

useEffect(function () {
  fetchDataList();
}, [sendRequest]);

const handlePageChange = (page) => {
  setPage(page);
  setSendRequest(Math.random());
}

但是這種寫法還是運用了命令式,違背了React Hooks本意,不推薦。推薦規則寫在useEffect中。

渲染優化

不管是 class 方式還是函數式編程,都需要關心一個問題:合理渲染。

class 方式在每次 setState 或者 forceUpdate 都會執行render函數渲染。

函數式編程方式 在useState中每次set新數據后,就會重新執行整個函數並渲染。

React 重要特徵是,一般情況下,父組件渲染,子組件也會渲染。所以在頂層容器中,要合理渲染,盡可能的抽成更小的組件,防止不必要的渲染。

class 方式中,state只放與rander有關的變量,無關的可以放在class外,減少setState的使用。函數式編程一樣,和return無關的變量可以放在函數外。

whosmeya.com

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

使用 git add -p 整理 patch_台北網頁設計

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

背景

當我們修改了代碼準備提交時,本地的改動可能包含了不能提交的調試語句,還可能需要拆分成多個細粒度的 pactch

本文將介紹如何使用 git add -p 來交互式選擇代碼片段,輔助整理出所需的 patch

官方介紹

先貼個幫助信息供參考

英文版本:

 -p, --patch
           Interactively choose hunks of patch between the index and the work tree and add them to
           the index. This gives the user a chance to review the difference before adding modified
           contents to the index.

           This effectively runs add --interactive, but bypasses the initial command menu and
           directly jumps to the patch subcommand. See “Interactive mode” for details.

中文版本:

-p, --patch
交互地在索引和工作樹之間選擇補丁塊並將它們添加到索引中。這讓用戶有機會在將修改后的內容添加到索引之前查看差異。

這可以有效地運行 add --interactive,但是會繞過初始命令菜單,而直接跳轉到 patch 子命令。有關詳細信息,請參見`‘交互模式’'。

demo 視頻版

以下文字版例子對應的視頻演示:

demo 文字版

我們造個例子來說明,假設我們本次完成了兩個功能,fun1 和 fun2,希望分開提交。另外在修改過程中還引入了一些調試的打印,是不需要提交的。

代碼的 diff 如下

 --git a/demo.c b/demo.c
index 0473c1a..76cfb22 100644
--- a/demo.c
+++ b/demo.c
@@ -1,16 +1,31 @@
 #include <stdio.h>

+void fun1()
+{
+       printf("before hello world\n");
+}
+
 void demo()
 {
        ;
 }

+void fun2()
+{
+       printf("after hello world\n");
+}
+
 int main()
 {
+       fun1();
        printf("hello world\n");
+       printf("debug %s %d\n", __func__, __LINE__);
        printf("hello world\n");
        printf("hello world\n");
        printf("hello world\n");
+       printf("debug %s %d\n", __func__, __LINE__);
        printf("hello world\n");
+       fun2();
        demo();
+       printf("debug %s %d\n", __func__, __LINE__);
 }

此時直接 git add 會把整個文件的改動都加進來,不符合需求。

這正是 patch mode 發揮作用的地方,我們可以挑選一部分改動進行提交。

輸入 git add -p 進入 patch mode , 此時 git 會自動將改動切分成多個片段,並展示第一個片段,提示你進行選擇。

提示語句是 Stage this hunk [y,n,q,a,d,/,s,e,?]?

這些字母都是什麼意思呢? 輸入?回車,可以查看詳細的幫助信息。

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

英文版本:

y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

中文版本:

y - 暫存此區塊
n - 不暫存此區塊
q - 退出;不暫存包括此塊在內的剩餘的區塊
a - 暫存此塊與此文件後面所有的區塊
d - 不暫存此塊與此文件後面所有的 區塊
g - 選擇並跳轉至一個區塊
/ - 搜索與給定正則表達示匹配的區塊
j - 暫不決定,轉至下一個未決定的區塊
J - 暫不決定,轉至一個區塊
k - 暫不決定,轉至上一個未決定的區塊
K - 暫不決定,轉至上一個區塊
s - 將當前的區塊分割成多個較小的區塊
e - 手動編輯當前的區塊
? - 輸出幫助

對於我們的例子,git第一次自動給出的hunk很大,可以先執行 s 分割下。分割后第一個區塊就只包含增加的 fun1 函數了。

/* 太占篇幅,此處省略原始 hunk */
Stage this hunk [y,n,q,a,d,/,s,e,?]? s /* 詢問我們對第一個片段的處理,我們覺得太大,按 s 要求分割 */
Split into 7 hunks. /* 可以看到,s 讓 git 將原始片段進一步切分成了 7 個片段,接下來就是自動展示第一個片段 */
@@ -1,7 +1,12 @@
 #include <stdio.h>

+void fun1()
+{
+       printf("before hello world\n");
+}
+
 void demo()
 {
        ;
 }

Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]?  /* 詢問我們對第一個片段的處理 */

輸入 y 回車選中這個 fun1 的改動,git 就會自動展示下一個片段,繼續詢問我們。

這樣對片段使用 yn,我們就可以只挑選出涉及 fun1 的改動,當我們確認後續沒有 fun1 相關的改動時,就可以按 q 退出挑選了。

此時 git status 可以看到部分改動在暫存區中。

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   demo.c

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   demo.c

使用 git diff --cached 可以具體確認要提交的內容,是否符合我們的預期,只包含 fun1 的改動,不包含 fun2 和調試語句。

$ git diff --cached
diff --git a/demo.c b/demo.c
index 0473c1a..b9fd4d4 100644
--- a/demo.c
+++ b/demo.c
@@ -1,5 +1,10 @@
 #include <stdio.h>

+void fun1()
+{
+       printf("before hello world\n");
+}
+
 void demo()
 {
        ;
@@ -7,6 +12,7 @@ void demo()

 int main()
 {
+       fun1();
        printf("hello world\n");
        printf("hello world\n");
        printf("hello world\n");

確認無誤就可以提交第一個patch, 即 fun1 的改動了。

git commit -m "fun1"

接下來繼續使用 git add -p,配合s,y,’n’就可以進一步挑選出fun2的改動了。

如果要挑選的改動比較明確,可以直接使用 /來搜索到目標hunk,省去逐個片段判斷的麻煩。例如執行 /fun2 來搜索包含 fun2 的代碼片段。

git add -p 挑選完之後,建議使用 git diff --cached 確認下,或者在提交之後 git show 確認下改動,如有錯漏,及時修正,多退少補。

大部分情況使用s y n就足夠了。但如果有些改動是混合在一起的,無法使用s來分割,那就得用 e 來手工編輯了,下回分解吧。

blog: https://www.cnblogs.com/zqb-all/p/13020293.html
公眾號:https://sourl.cn/MDcrJA

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

【譯】Welcome to C# 9.0_網頁設計公司

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

  C# 9.0正在形成,我想分享我們對添加到該語言下個版本的一些主要功能的看法。對於每個新版本的 C#,我們努力使常見的編碼方案更加清晰和簡單,C# 9.0 也不例外。這次的一個特別重點是支持數據形狀的簡潔和不可變表示。

  讓我們潛入吧!

1 僅可初始化的屬性

  對象初始化器是非常好用的。它們為類型實例化提供了一種非常靈活且可讀的格式來創建對象,尤其是對於一次創建特別大的嵌套對象來說。下面是一個簡單的例子:

new Person
{
    FirstName = "Scott",
    LastName = "Hunter"
}

  對象初始化也使用戶不必編寫大量構造函數,要做的就是編寫一些屬性!

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

  今天,一個很大的限制是,屬性必須是可修改的,對象初始化器是這樣工作的:首先調用對象的構造函數(默認為無參的構造函數),然後分配給屬性設置器(property setter)。

  僅可初始化屬性修改了這一點!它們引入了一個 init 訪問器,該訪問器是set訪問器的變體,只能在對象初始化期間調用:

public class Person
{
    public string FirstName { get; init; }
    public string LastName { get; init; }
}

  使用此聲明,除了初始化外,之後任何後續賦值給 FirstName 和 LastName 屬性都是一個錯誤。

  因為init訪問器只能在初始化期間訪問,因此他們允許修改封閉類型中的只讀字段,就像在構造函數中那樣:

public class Person
{
    private readonly string firstName;
    private readonly string lastName;
   
    public string FirstName
    {
        get => firstName;
        init => firstName = (value ?? throw new ArgumentNullException(nameof(FirstName)));
    }
    public string LastName
    {
        get => lastName;
        init => lastName = (value ?? throw new ArgumentNullException(nameof(LastName)));
    }
}

2 記錄

  如果要使單個屬性不可變,則僅可初始化屬性非常適合。如果希望整個對象不可變且像值類型一樣,則應考慮將其聲明為記錄:

public data class Person
{
    public string FirstName { get; init; }
    public string LastName { get; init; }
}

  類聲明中的data關鍵字將其標記為記錄。這賦予它幾個類似價值類型的行為,我們將在下面深入探討這些行為。一般來說,記錄更被視為”值”(純數據), 而不是作為對象。您可以通過創建新記錄表示新狀態來表示隨時間的變化。它們不是由標識定義,而是由其內容定義。

2.1 With表達式

  使用不可變數據時,一種常見模式是從現有值創建新值以表示新狀態。例如,如果我們更改LastName,我們會將其表示為一個新對象,該對象是舊對象的副本,但LastName不同。這種技術通常被稱為非破壞性修改。記錄這種特性表示的是Person在給定時間的狀態。

  為了適應這種編程風格,記錄允許一種新的表達式——with:

var otherPerson = person with{LastName="Hanselman"};

  with表達式使用對象初始化器語法來說明新對象與舊對象的不同內容。您可以指定多個屬性。

  記錄隱式定義一個受保護的”複製構造函數”-一個構造函數,它獲取現有記錄對象,並逐個將其字段複製到新的對象:

protected Person(Person original){/* copy all the fields */}// generated

  with 表達式會導致調用複製構造函數,然後在上面應用對象初始化器以相應地更改屬性。

  如果您不喜歡生成的複製構造函數的默認行為,則可以改為定義自己的行為,該行為將由with表達式選取。

2.2 基於值的相等性

  所有對象都從Object繼承 Equals(object)。結構將其重寫為具有”基於價值的相等性”,通過遞歸地調用Equals來比較結構的每個字段。記錄也執行相同的操作。這意味着,根據其”值”,兩個記錄對象可以彼此相等,而不必是同一對象。例如:

var originalPerson = otherPerson with { LastName = "Hunter" };

  現在 ReferenceEquals(person, originalPerson) = false(這兩個不是一個對象)但是Equals(person, originalPerson) = true (他們有相同的值)。

  如果您不喜歡生成的 Equals 重寫的默認逐字段比較行為,則可以改為編寫自己的字段比較行為。你只需要小心,你了解基於值的相等在記錄中是如何工作的,特別是當涉及繼承時。

  除了重寫Equals 外,還有 GetHashCode()。

2.3 數據成員

  記錄絕大多數都是不可變的,只有隻讀初始化器可以通過with表達式進行非破壞性修改。為了針對這種常見情況進行優化,記錄在聲明時會更改string FirstName這類成員聲明的行為。與其他類和結構聲明中的隱式private字段不同,在記錄中,這被視為public的、僅可初始化的自動屬性的縮寫!因此:

public data classPerson
{
    string FirstName;
    string LastName;
}

  與

public data classPerson
{
    public string FirstName{get; init;}
    public string LastName{get; init;}
}

  是相同的。

  我們認為這有助於做出漂亮而清晰的記錄聲明。如果您真的需要私有字段,只需顯式地添加private修飾符:

private string firstName;

2.4 基於位置的記錄

  有時,對記錄採用更為位置化的方法是有用的,在這種方法中,記錄的內容通過構造函數參數的位置給出,並且可以通過解構函數來提取。

  可以在記錄中指定自己的構造函數和解構函數:

public data classPerson
{
    string FirstName;
    string LastName;
    public Person(string firstName,string lastName)
      =>(FirstName,LastName)=(firstName, lastName);
    public void Deconstruct(out string firstName,out string lastName)
      =>(firstName, lastName)=(FirstName,LastName);
}

  上面代碼可以簡寫為:

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

public data class Person(string FirstName,string LastName);

  這將聲明public的僅初始化的自動屬性以及構造函數和解構函數,以便您可以編寫:

var person =new Person("Scott","Hunter");// positional construction
var(f, l)= person;                        // positional deconstruction

  如果您不喜歡生成的自動屬性,則可以改為定義自己的同名屬性,生成的構造函數和解構函數將使用該屬性。

2.5 記錄的改變引發的問題

  想象一下,將記錄對象放入字典中。再次找到它取決於 Equal 和GetHashCode。如果記錄改變其狀態,它也會改變它等於什麼!我們可能再也找不到了!在哈希表實現中,它甚至可能損壞數據結構,因為定位基於的是”到達哈希表時”的哈希值!

  雖然可以通過重寫一些內部方法來改變這種默認的行為,但其工作量也是相當巨大的。

2.6 with表達式與繼承

public data class Person{string FirstName;string LastName;}
public data class Student:Person{int ID;}
Person person =new Student{FirstName="Scott",LastName="Hunter", ID =GetNewId()};
otherPerson = person with{LastName="Hanselman"};

  在最後一行上使用with表達式時,編譯器不知道person實際上包含了一個Student。而且,即使otherPerson實際上不是”Student”對象,它也不是一個正確的副本,該對象與複製的第一個對象具有相同的ID。

  記錄有一個隱藏的虛方法,它委託”克隆”整個對象。每個派生記錄類型都重寫此方法以調用該類型的複製構造函數,以及派生鏈上的複製構造函數直到基類記錄的複製構造函數。with表達式只需調用隱藏的”克隆”方法,並將對象初始化器應用於結果。

2.7 值相等與繼承

  與with表達式的實現類似,基於值的相等性也必須是”虛擬”的,即Student需要比較所有字段,即使比較時能夠得知類型是基類型Person。這是很容易通過重寫已經虛擬的Equals方法實現的。

  但是,相等還有一個挑戰:如果比較兩種不同的Person,該怎麼辦?我們不能讓其中一個決定是否相等:相等應該是對稱的,所以無論兩個對象中哪個是第一個,結果都應該是相同的。換句話說,他們必須就適用的相等達成一致!

  說明問題的示例:

Person person1 =new Person{FirstName="Scott",LastName="Hunter"};
Person person2 =new Student{FirstName="Scott",LastName="Hunter", ID =GetNewId()};

  這兩個對象彼此相等嗎?person1可能會這樣認為,因為person2有所有的Person的構造,但person2會認為與person1不同!我們需要確保他們都同意他們是不同的對象。

  C# 會自動為您處理。它的實現方式是每個記錄都有一個”EqualityContract”的虛擬受保護屬性。每個派生記錄都會重寫它,為了比較相等,兩個對象必須具有相同的EqualityContract。

3 簡化頂級程序

  之前我們這樣寫代碼:

using System;
class Program
{
    static void Main()
    {
        Console.WriteLine("Hello World!");
    }
}

  現在您可以選擇在頂層編寫主程序:

using System;
Console.WriteLine("Hello World!");

  支持任何語句,但必須在using之後以及文件中的任何類型或命名空間聲明之前,並且只能在一個文件中執行此操作,就像目前只能有一個Main方法一樣。如果要返回狀態代碼,可以執行此操作。如果你想await,你可以這樣做。如果要訪問命令行參數,可以訪問args參數。

  局部函數是語句的一種形式,在頂級程序中也允許使用。從頂級語句部分以外的任何位置調用它們都是錯誤的。

4 改進模式匹配

  在 C# 9.0 中添加了幾種新類型的模式。例如:

public static decimal CalculateToll(object vehicle) =>
    vehicle switch
    {
       ...
        DeliveryTruck t when t.GrossWeightClass > 5000 => 10.00m + 5.00m,
        DeliveryTruck t when t.GrossWeightClass < 3000 => 10.00m - 2.00m,
        DeliveryTruck _ => 10.00m,
        _ => throw new ArgumentException("Not a known vehicle type", nameof(vehicle))
    };

4.1 簡單類型模式

  目前,類型模式需要在類型匹配時聲明一個標識符,即使該標識符是一個_,比如 DeliveryTruck  _。新語法不用了,可以簡寫為:

DeliveryTruck => 10.00m,

4.2 關係模式

  C#9.0引入了對應於關係運算符<、<=等的模式。因此,新語法可以這樣寫:

DeliveryTruck t when t.GrossWeightClass switch
{
    > 5000 => 10.00m + 5.00m,
    < 3000 => 10.00m - 2.00m,
    ...
},

4.3 邏輯模式

  最後,可以將模式與邏輯運算(and 、or、not)符組合起來,並將其拼寫為單詞,以避免與表達式中使用的運算符混淆。例如:

DeliveryTruck t when t.GrossWeightClass switch
{
    < 3000 => 10.00m - 2.00m,
    >= 3000 and <= 5000 => 10.00m,
    > 5000 => 10.00m + 5.00m,
},

  not的常見用法是將其應用於判空。例如:

not null => throw new ArgumentException($"Not a known vehicle type: {vehicle}", nameof(vehicle)),
null => throw new ArgumentNullException(nameof(vehicle))

  還有,if (!(e is Customer)) { … }在新語法中,可以寫為if (e is not Customer) { … }

5 目標類型

  ”Target typing”是當表達式從使用位置的上下文中獲取其類型時,我們使用的術語。C# 9.0支持新的類型推斷。

5.1 new

  新語法中,如果是明確的類型,則在使用new時,可以不聲明類型了。比如:

Point p = new (3, 5);

5.2 ?? and ?:

  目前,??與?:如果分支之間不是同一類型會報錯。新語法下,如果兩個分支都可以轉換為目標類型則是允許的:

Person person = student ?? customer; // Shared base type
int? result = b ? 0 : null; // nullable value type

6 改進協變

  有時,派生類中的方法返還比基類中的聲明更具體的類型是很有用的。C# 9.0 允許:

abstract class Animal
{
    public abstract Food GetFood();
    ...
}
class Tiger : Animal
{
    public override Meat GetFood() => ...;
}

   此外,還要很多新的改進,讓我們拭目以待吧。

原文鏈接

    https://devblogs.microsoft.com/dotnet/welcome-to-c-9-0/?utm_source=vs_developer_news&utm_medium=referral

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊