2013第五屆中國(臨沂)新能源汽車、電動車及零部件展覽會

主辦單位:中國國際貿易促進委員會臨沂市委員會、山東省環保產業協會、山東省環保產品認證中心 、臨沂市資源節約型環境友好型社會建設改革試點辦公室

承辦單位:臨沂市格益傳媒有限公司

抓住機遇2012 New energy vehicles Exhibition 激情魯南,物流業大市的優勢催生山東商業「二次飛躍」新格局2012 New energy vehicles Exhibition送給您一個千載難逢的商機!山東是國內第三大市場,臨沂是山東最重要的產品集散地,同時是國內第二大商貿城和物流之都,500公里半徑覆蓋華北市場,全國十大工業品市場中名列第三。作為魯東南中心城市,凝聚力、輻射力、帶動力逐步提升,現已成為全國繼江蘇、浙江、天津之後新崛起的電動車產業基地,山東省十大影響力產業集群。

「一年之計在於春」,由格益傳媒有限公司承辦的「第五屆中國(臨沂)新能源汽車、電動車及零部件展覽會」定於2013年4月舉行, 4月既是商家銷售產品的有利時機也是商家採購產品的旺季,同時也是廠家促銷產品、推出新品、打造品牌的最佳時機。在這個時候新能源電動車及零部件展覽會有利於促進廠商之間的交流,實現共同發展。我們誠摯的邀請廣大新能源電動汽車、電動車及零部件廠商到商貿物流城-臨沂參展、參會,共享成功展會帶來的巨大商機!

【展會日程安排】展覽時間: 2013年4月19-21日 閉幕撤展時間:2013年4月21日下午15:00
  
【參展範圍】新能源車輛展區:整 車:電動(混合動力)汽車、電動旅遊觀光車、電動高爾夫車,電動吉普車、太陽能電動車、電動客貨車、電動清潔車、電動叉車、電動升降車;氫能源、天然氣等各種新能源車輛;各種低排放、環保節能型汽車臨沂特色電動客運三輪車展區電動兩輪、三輪車展區:各類電動自行車、電動三輪車、燃油助力車及殘疾人專用電動車、電動滑板車等特種電動車特種車輛展區:清障車、環保車輛、改裝車輛等。配套電池、配件、零部件和相關技術資料展區

【收費標準】 國際標準展位:展位3m×3m 3600元 /個 國際標準展位(雙面開口) 4200元/個標準展位配套設施:三面或兩面展板、一張洽談桌、兩把椅子、兩盞射燈、一個220V的電源插座、參展單位楣板文字製作以及展館內衛生、安全保衛等。

特展:最少以36平方米起租,國內企業:400元/平方米,國外企業100美元/平方米;(註:室內空地無配套設施:展具由參展商自行設計搭建。)

【參展手續】◆填寫參展申請書,加蓋公章後郵寄或傳真至大會組委會,參展申請被接收後組委會將通過傳真或郵寄方式發放「參展確認書」確認您的申請;展位按「先報名,先分配,先付款」的原則安排。

◆申請被確認後7天內將所需費用匯入大會指定帳號,逾期不確認參展資格,展位按「先申請,先付款,先分配」的原則安排。

◆會前一個月組委會將協助參展企業完成參展後續服務。參展一經確認,參展商不得撤消參展和轉讓展位。因某種特殊原因或不可抗拒因素時,組委會有權將展期和展場更改,若因某種原因取消本次會議,參展商所交費用全部退回;

◆組委會根據現場實際情況有權對極少數參展企業的展位予以現場調整。

【展會特色及亮點】

1、通過山東省的宣傳媒體,在本地區進行密集宣傳推介;
2、各專業報刊、雜誌媒體宣傳推介本屆展會信息及互聯網推廣;
3、發函邀請各行業內專業協會、團體;並邀約海內外客商及中間商參觀;
4、山東省首家涉足新能源汽車展並連續成功舉辦四屆的專業展會;
5、山東省行業內唯一採用「大巴車免費迎接經銷商」參展模式的專業展會;
6、組委會同時組織了電動車行業發展論壇,資深業內專業人士深入探討交流;
7、組委會安排專人走訪市場並邀請安徽、江蘇、河南、河北、山東、浙江、天 津等地的電動車及零部件產業類生產企業,進一步廣泛邀請專業經銷商。
8、發函邀請友好城市政府機構、行業組織;

大會組委會聯繫方式:

聯繫人:2013第五屆中國(臨沂)新能源汽車、電動車及零部件展覽會組委會
電 話:0539-8059156 15725997759 15653999229 張經理
傳 真:0539-8059156

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

※幫你省時又省力,新北清潔一流服務好口碑

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

第九届北京国际纯电动车、混合动力车暨新能源汽车及配套设施展览会

主办单位:中国汽车工程学会电动汽车分会、中国电工技术学会电动车辆专业委员会
承办单位:北京泽安达展览有限公司
支持单位: 北京市人民政府

2013第九届北京国际纯电动车、混合动力车暨新能源汽车及配套设施展览会”已历经8载,是国内最早的已具规模的专业的电动汽车行业年度盛会。将于2013年7月6日-8日在北京-中国国际展览中心(老馆)继续举办。
上届(第八届)展会于2012年7月3日—5日在北京-中国国际展览中心(老馆)取得圆满成功;国内外包括北汽、长安、一汽、长城、时风、益高、韩国LG、美国Remy、日本安川、天能、超威、ITT、英飞凌、中航锂电、玉柴、国电、中国兵器、珠海泰坦、浙江万马等260家整车、零部件、充电站设施及相关企业参展、展出面积13000平方米、专业观众25000多人次。

本届展会预计展出四个馆、20000平方米;参展企业预计300家:专业观众30000人次。展会活动形式多样,主要包括展览会开幕式、论坛、主题会议、颁奖晚宴、热点问题沙龙、电动汽车产业发展研讨会、电动车辆学术年会、电动汽车电池电机专题研讨、电动汽车充电站建设技术设施专题展、节能与新能源车示范推广城市政府职能部门和公交公司领导与整车企业互动等。活动将邀请科技部、发改委、工信部等有关政府部门主管领导和欧洲、美洲、亚太等地区及国家的行业协会组织代表出席。

地 址:北京市东城区安定门外大街208号三利大厦7017室
电 话:86-10-51236248
传 真:86-10-51236249
网 址:www.ievechina.com
邮 箱:bj_evs@sina.com
联系人:刘杰

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

※新北清潔公司,居家、辦公、裝潢細清專業服務

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

※FB行銷專家,教你從零開始的技巧

2013年郑州(国际)新能源汽车及校车展览会

主办单位:河南省电动汽车产业发展领导小组、河南省电动汽车产业联盟、河南省电动车辆工程协会、中国国际贸易促进委员会郑州支会、中国国际商会郑州商会、河南大成展览服务有限公司
承办单位:中国国际商会郑州商会、河南大成展览服务有限公司

新能源汽车作为国家战略性新兴产业,被看做中国汽车行业今后五年发展的重中之重,新能源汽车也将迎来动力系统转型发展的战略机遇期。

河南省在新能源汽车方面面临着重大发展机遇。为稳定汽车消费,加快结构调整,推动产业升级,国家制定了《汽车产业调整和振兴规划》,从扩大消费需求、增强自主创新能力、推进企业战略重组、加快新能源汽车发展等方面出台了一系列政策措施,为汽车产业更好更快发展提供了良好环境和新的机遇。特别是在资源、环境的约束下,汽车动力系统进入转型期,新能源汽车和节能型汽车成为国家支持的重要领域。汽车动力系统的电动化和经济适用型汽车成为汽车产业持续、快速发展的关键,为河南省在新能源汽车和节能经济型微车方面的发展提供了机遇。抓住国家实施新能源汽车战略的机遇,坚持自主研发与战略合作相结合,实施边路突破战略,着力做强电池、电机等关键零部件,提升新能源汽车整车水平,形成较为完整的新能源汽车产业链。到2013年,动力电池产业率先实现突破,混合动力、纯电动整车实现规模化生产。到2015年,在电动汽车动力系统、控制系统、管理系统、专用底盘等方面形成核心技术,所有整车企业具备新能源汽车制造能力。到2020年,建设成为我国重要的新能源汽车生产基地。

综上所述,河南新能源汽车产业发展潜力巨大,同时国家对校车的鼓励政策以及在该领域内陆续实施的一系列重点工程,给该产业发展带来了无限商机和激烈的国内外竞争,也使校车产业在信息沟通、技术交流、成果宣传等方面的需求日趋强烈,为迎合新能源汽车与校车迅猛的发展趋势,满足国内外相关企业在应用技术与装备领域的生产和贸易需求,进一步推动我省新能源汽车及校车安全技术的提高,兹有河南省电动汽车产业发展领导小组、河南省电动汽车产业联盟、河南省电动车辆工程协会、中国国际贸易促进委员会郑州支会、中国国际商会郑州商会、河南大成展览服务有限公司定于2013年5月27-29日在郑州国际会展中心举“ “2013年郑州(国际)新能源汽车及校车展览会”。

组委会联系方式:

电话:0371-55627056 55627057 传真:0371-55627058

手机:13598889948

联系人:沈家军

邮箱:dachengexpo@163.com

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※新北清潔公司,居家、辦公、裝潢細清專業服務

※別再煩惱如何寫文案,掌握八大原則!

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

※超省錢租車方案

※教你寫出一流的銷售文案?

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

TT electronics推出用於混合動力汽車的大功率電阻

 

TT electronics公司推出WPRT系列線繞功率徑向端子(Wirewound Power Radial Terminal)電阻,符合AEC-Q200標準,設計用於滿足包括混合動力汽車(Hybrid Electric Vehicle, HEV)的大功率應用的特殊要求。   隨著WPRT系列的推出,TT electronics現在已提供業界最廣泛的規格和配置。新電阻系列由高純度陶瓷棒和壓配 (force-fit) 端帽(end-cap)構成,其上纏繞著導線元件,而後使用防火絕緣接合劑將其放置在陶瓷容器內,因此,在規定的溫度和超載狀況下電阻能夠完全防火。   這款電阻產品採用針對浪湧性能而優化的獨特設計,使之成為電動汽車和電機驅動的理想選擇。WPRT系列根據最高容差標準製造,可以很好地適合汽車保護裝置,大大改進了裝配性能。   TT electronics高級應用工程師 Stephen Oxley 評論說:“WPRT系列瞄準工業、汽車和能源領域的特定需求,通過開發最廣泛的此種類別功率電阻,TT electronics正在實踐承諾,不但支援客戶的節能設計,同時消除開發定制功率電阻解決方案的風險、成本和複雜性。”   WPRT系列可用於HEV預充電和BDU放電應用,以及保護電機避免浪湧電流的損壞。此外,該系列採用了浪湧保護設計,也適用於UPS系統。   WPRT系列包含了從10W至50W的六種額定功率,對於WPRT50 (50W)器件,可耐受最大250W超載。TT electronics提供的這些電阻都符合E24標準電阻值。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

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

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

2013自行車展-自行車輛更來電

2013自行車展盛大展出,根據集邦科技旗下綠能事業部EnergyTrend的現場了解,除了汽車廠豐田汽車提出了鋰電池在電動載具的應用看法外,自行車方面,包括了變速器廠以及電池廠也紛紛對於電動自行車提出各自的最新的商品展示,無論是零組件廠以及整車廠,都讓參觀者對於車輛電動化的延伸發展,產生的極大期待,讓電動自行車從過去的代步、健身兼具延伸續航距離,發展到未來將整合隨身電子裝置,讓人們對電動車量的普及充滿樂觀。

豐田汽車鋰電池電動車開賣

雖然全球電動汽車銷售市況不如預期,以Nissan leaf來看,銷量逐步好轉,目前在日本每月銷售約800輛、北美則有1,600輛,截至目前累計約兩萬多輛。根據自行車研討會的演說分享,豐田汽車所寄予厚望的重量級車款Prius α 預計在2013年底上市(全球),並且為首度配置的鋰電池中階車款,電池位置也因為體積輕巧而配置於車室內。豐田目前使用NCA材料做為正極材料,電池芯單元為3.7V, 5Ah,總電池容量約4.4kWh,2014年將推出新款車款IQ,12kWh,預計仍是使用NCA材料(圖一)。
 
圖一 豐田汽車

 
   
變速器、系統整合、電池模組熱鬧參與

作為自行車變速系統龍頭大廠,Shimano也將電子化與變速系統做了創新結合。在Shimano E tube計畫裡頭,將以變速系統Di2做為變速系統電子化為主要訴求,初期將落實在維修體系以及變速資訊的便利性上,未來更有可能藉著電池系統的搭配,提供車主更多的資訊來源(圖二),進而成為讓消費者改變使用習慣的革命。
 
圖二 Shimano E tube應用展示

 
三星SDI做為目前全球第二大的電池芯廠(僅次於合併後的Sanyo + Panasonic),除了在消費型應用的鋰電池產業著墨甚多外,近年也積極切入電動工具以及電動自行車等利基市場,更從過去的電池芯供應,逐步跨足到電池模組(圖三)。

以電動自行車來看,此次展出全方位的自行車電池,可提供後架、坐管、下管等不同位置的應用模組。目前全球各地電動自行車因使用族群不同而衍生出不同擺放位置的設計,中國市場大多以坐管以及後架位置為主要設計,主要訴求在荷重與價格;歐洲則集中在下管及座管位置,用於強調於設計外觀一體性,根據會場的展示DM,目前三星主推2.1Ah以及2.8Ah兩顆自行車專用三元材料電池芯,最大放電率可達到3C(C-rate),已可滿足各種路況的電動自行車的使用需求。
 
圖三 三星自行車電池解決方案展示


   
中華車在配合工業局補助政策,全力推廣電動機車銷售,並且在2012年繳出了六千輛的銷售佳績,未來也將從整車品牌退居幕後,藉著曾經扮演整車零組件整合的豐富經驗,轉型成為關鍵零組件提供者,本次特別展示了關鍵零組件品牌GreenTrans,提供中華車的Power Kit(圖四),包含了扭力感測器、LCD顯示、以及馬達驅動系統,2012年起已與台灣多家自行車廠合作,包括永祺、世同、達生、紹凱、吉安等,都採用中華的Power Kit系統組裝成車。

圖四 中華電動車套件供應分類展示


   
台灣電池模組大廠新普科技也展示了已耕耘三年的電動自行車商品,本次特別針對歐洲市場,與美國品牌Specialize、法國品牌BTwin進行合作(圖五),分別展出下管以及後座電池組產品。

與Specialize合作的登山車,下管產品特色在於電池與車架進行整合,呈現高度客製化,與客戶的關係也將因此而更形緊密。另外BTwin所推出的tilt折疊車系列,目前定位在堅固耐用,為了維持車體的強度,電池模組僅在延伸支架上做結合。新普科技憑藉著對於電池芯的品質掌握度,再加上電源管理的豐富經驗,相信未來在電動自行車市場後市可期。

圖五 新普科技電池模組展示

 
   
另一家作風一向低調的台灣電池模組大廠順達科技也積極跨足各種電池類型應用,於2012年與台達電合作的備用電源產品首次發表即得到設計大獎的殊榮外,此次自行車展也不遑多讓,搭配合作的車廠於現場展出了電動自行車模組的電池模組應用,與中國第一大馬達與控制器廠安乃達做配合,搭配了恪萊博(climbull)各系列整車系統(圖六),這樣的策略合作與全系列搭配的組合,也產生令人期待的商品。

恪萊博的產品策略主打戶外運動客層,屬於高階客群,有別於一般通勤族,由於戶外運動屬於白領階級活動,產品單價較高,且一般通勤族需要載重負荷,容易導致產品壽命偏低,對品牌形象反而產生負面影響,因而改以戶外運動客層為主要訴求對象為主,從應用定位面來扭轉可能造成的問題。而整車產品賣點在於搭配新型中置高速馬達,結合其馬達減速系統,可與外變速系統做最有效益的齒輪比搭配,進而提升產品的壽命與動力表現。

圖六 順達科技電池模組展示

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

※FB行銷專家,教你從零開始的技巧

面試官:十問泛型,你能扛住嗎?

問題一:為什麼需要泛型?

答:

使用泛型機制編寫的代碼要比那些雜亂的使用Object變量,然後再進行強制類型轉換的代碼具有更好的安全性和可讀性,也就是說使用泛型機制編寫的代碼可以被很多不同類型的對象所重用。

問題二:從ArrayList的角度說一下為什麼要用泛型?

答:

在Java增加泛型機制之前就已經有一個ArrayList類,這個ArrayList類的泛型概念是使用繼承來實現的。

public class ArrayList {
    private Object[] elementData;
    public Object get(int i) {....}
    public void add(Object o) {....}
}

這個類存在兩個問題:

  1. 當獲取一個值的時候必須進行強制類型轉換
  2. 沒有錯誤檢查,可以向數組中添加任何類的對象
ArrayList files = new ArrayList();
files.add(new File(""));
String filename = (String)files.get(0);

對於這個調用,編譯和運行都不會出錯,但是當我們在其他地方使用get方法獲取剛剛存入的這個File對象強轉為String類型的時候就會產生一個錯誤。

泛型對於這種問題的解決方案是提供一個類型參數。

ArrayList<String> files = new ArrayList<>();

這樣可以使代碼具有更好的可讀性,我們一看就知道這個數據列表中包含的是String對象。 編譯器也可以很好地利用這個信息,當我們調用get的時候,不需要再使用強制類型轉換,編譯器就知道返回值類型為String,而不是Object:

String filename = files.get(0);

編譯器還知道ArrayList<String>中add方法中有一個類型為String的參數。這將比使用Object類型的參數安全一些,現在編譯器可以檢查,避免插入錯誤類型的對象:

files.add(new File(""));

這樣的代碼是無法通過編譯的,出現編譯錯誤比類在運行時出現類的強制類型轉換異常要好得多。

問題三:說說泛型類吧

一個泛型類就是具有一個或多個類型變量的類,對於這個類來說,我們只關注泛型,而不會為數據存儲的細節煩惱。

public class Couple<T> {
   private T one;
   private T two;
}

Singer類引入了一個類型變量T,用尖括號括起來,並放在類名的後面。泛型類可以有多個類型變量:

public class Couple<T, U> {...}

類定義中的類型變量是指定方法的返回類型以及域和局部變量的類型

//域
private T one;
//返回類型
public T getOne() { return one; }
//局部變量
public void setOne(T newValue) { one = newValue; }

使用具體的類型代替類型變量就可以實例化泛型類型:

Couple<Rapper>

泛型類可以看成是普通類的工廠,打個比方:我用泛型造了一個模型,具體填充什麼樣的材質,由使用者去做決定。

問題四: 說說泛型方法的定義和使用

答:

泛型方法可以定義在普通類中,也可以定義在泛型類中,類型變量是放在修飾符的後面,返回類型的前面。

我們來看一個泛型方法的實例:

class ArrayUtil {

    public static <T> T getMiddle(T...a){
        return a[a.length / 2];
    }
}

當調用一個泛型方法時,在方法名前的尖括號中放入具體的類型:

String middle = ArrayUtil.<String>getMiddle("a","b","c");

在這種情況下,方法調用中可以省略<String>類型參數,編譯器會使用類型推斷來推斷出所調用的方法,也就是說可以這麼寫:

String middle = ArrayAlg.getMiddle("a","b","c");

問題五:E V T K ? 這些是什麼

答:

  • E——Element 表示元素 特性是一種枚舉
  • T——Type 類,是指Java類型
  • K—— Key 鍵
  • V——Value 值
  • ?——在使用中表示不確定類型

問題六:了解過類型變量的限定嗎?

答:

一個類型變量或通配符可以有多個限定,例如:

<T extends Serializable & Cloneable>

單個類型變量的多個限定類型使用&分隔,而,用來分隔多個類型變量。

<T extends Serializable,Cloneable>

在類型變量的繼承中,可以根據需要擁有多個接口超類型,但是限定中至多有一個類。如果用一個類作為限定,它必定是限定列表中的第一個。

類型變量的限定是為了限制泛型的行為,指定了只有實現了特定接口的類才可以作為類型變量去實例化一個類。

問題七:泛型與繼承你知道多少?

答:

首先,我們來看一個類和它的子類,比如 Singer 和 Rapper。但是Couple<Rapper>卻並不是Couple<Singer>的一個子類。

無論S和T有什麼聯繫,Couple<S>與Couple<T>沒有什麼聯繫。

這裏需要注意泛型和Java數組之間的區別,可以將一個Rapper[]數組賦給一個類型為Singer[]的變量:

Rapper[] rappers = ...;
Singer[] singer = rappers;

然而,數組帶有特別的保護,如果試圖將一個超類存儲到一個子類數組中,虛擬機會拋出ArrayStoreException異常。

問題八:聊聊通配符吧

答:

通配符類型中,允許類型參數變化。比如,通配符類型:

Couple<? extends Singer>

表示任何泛型類型,它的類型參數是Singer的子類,如Couple<Rapper>,但不會是Couple<Dancer>。

假如現在我們需要編寫一個方法去打印一些東西:

public static void printCps(Couple<Rapper> cps) {
      Rapper one = cp.getOne();
      Rapper two = cp.getTwo();
      System.out.println(one.getName() + " & " + two.getName() + " are cps.");
}

正如前面所講到的,不能將Couple<Rapper>傳遞給這個方法,這一點很受限制。解決的方案很簡單,使用通配符類型:

public static void printCps(Couple< ? extends Singer> cps) 

Couple<Rapper>是Couple< ? extends Singer>的子類型。

我們接下來來考慮另外一個問題,使用通配符會通過Couple< ? extends Singer>的引用破壞Couple<Rapper>嗎?

Couple<Rapper> rapper = new Couple<>(rapper1, rapper2);
Couple<? extends Singer> singer = rapper;
player.setOne(reader);

這樣可能會引起破壞,但是當我們調用setOne的時候,如果調用的不是Singer的子類Rapper類的對象,而是其他Singer子類的對象,就會出錯。 我們來看一下Couple<? extends Singer>的方法:

? extends Singer getOne();
void setOne(? extends Singer);

這樣就會看的很明顯,因為如果我們去調用setOne()方法,編譯器之可以知道是某個Singer的子類型,而不能確定具體是什麼類型,它拒絕傳遞任何特定的類型,因為 ? 不能用來匹配。 但是使用getOne就不存在這個問題,因為我們無需care它獲取到的類型是什麼,但一定是Singer的子類。

通配符限定與類型變量限定非常相似,但是通配符類型還有一個附加的能力,即可以指定一個超類型限定:

? super Rapper

這個通配符限製為Rapper的所有父類,為什麼要這麼做呢?帶有超類型限定的通配符的行為與子類型限定的通配符行為完全相反,可以為方法提供參數,但是卻不能獲取具體的值,即訪問器是不安全的,而更改器方法是安全的:

編譯器無法知道setOne方法的具體類型,因此調用這個方法時不能接收類型為Singer或Object的參數。只能傳遞Rapper類型的對象,或者某個子類型(Reader)對象。而且,如果調用getOne,不能保證返回對象的類型。

總結一下:

帶有超類型限定的通配符可以向泛型對象寫入,帶有子類型限定的通配符可以從泛型對象讀取。

問題九:泛型在虛擬機中是什麼樣呢?

答:

  1. 虛擬機沒有泛型類型對象,所有的對象都屬於普通類。 無論何時定義一個泛型類型,都自動提供了一個相應的原始類型。原始類型的名字就是刪去類型參數后的泛型類型名。擦除類型變量,並替換成限定類型(沒有限定的變量用Object)。這樣做的目的是為了讓非泛型的Java程序在後續支持泛型的 jvm 上還可以運行(向後兼容)

  2. 當程序調用泛型方法時,如果擦除返回類型,編譯器插入強制類型轉換。

Couple<Singer> cps = ...;
Singer one = cp.getOne();

擦除cp.getOne的返回類型后將返回Object類型。編譯器自動插入Singer的強制類型轉換。也就是說,編譯器把這個方法調用編譯為兩條虛擬機指令:

對原始方法cp.getOne的調用 將返回的Object類型強制轉換為Singer類型。

  1. 當存取一個公有泛型域時也要插入強制類型轉換。
//我們寫的代碼
Singer one = cps.one;
//編譯器做的事情
Singer one = (Singer)cps.one;

問題十:關於泛型擦除,你知道多少?

答:

類型擦除會出現在泛型方法中,程序員通常認為下述的泛型方法

public static <T extends Comparable> T min(T[] a)

是一個完整的方法族,而擦除類型之後,只剩下一個方法:

public static Comparable min(Comparable[] a)

這個時候類型參數T已經被擦除了,只留下了限定類型Comparable。

但是方法的擦除會帶來一些問題:

class Coupling extends Couple<People> {
    public void setTwo(People people) {
            super.setTwo(people);
    }
}

擦除后:

class Coupling extends Couple {
    public void setTwo(People People) {...}
}

這時,問題出現了,存在另一個從Couple類繼承的setTwo方法,即:

public void setTwo(Object two)

這顯然是一個不同的方法,因為它有一個不同類型的參數(Object),而不是People。

Coupling coupling = new Coupling(...);
Couple<People> cp = interval;
cp.setTwo(people);

這裏,希望對setTwo的調用具有多態性,並調用最合適的那個方法。由於cp引用Coupling對象,所以應該調用Coupling.setTwo。問題在於類型擦除與多態發生了衝突。要解決這個問題,就需要編譯器在Coupling類中生成一個橋方法:

public void setTwo(Object second) {
    setTwo((People)second);
}

變量cp已經聲明為類型Couple<LocalDate>,並且這個類型只有一個簡單的方法叫setTwo,即setTwo(Object)。虛擬機用cp引用的對象調用這個方法。這個對象是Coupling類型的,所以會調用Coupling.setTwo(Object)方法。這個方法是合成的橋方法。它會調用Coupling.setTwo(Date),這也正是我們所期望的結果。

所以,我們要記住關於Java泛型轉換的幾個點:

  1. 虛擬機中沒有泛型,只有普通的類和方法
  2. 所有的類型參數都用它們的限定類型替換
  3. 橋方法被合成來保持多態
  4. 為保持類型安全性,必要時插入強制類型轉換

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

【其他文章推薦】

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

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

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

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

※別再煩惱如何寫文案,掌握八大原則!

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

MongoDB設計方法及技巧

MongoDB是一種流行的數據庫,可以在不受任何錶格schema模式的約束下工作。數據以類似JSON的格式存儲,並且可以包含不同類型的數據結構。例如,在同一集合collection 中,我們可以擁有以下兩個文檔document:

{
    id: '4',
    name: 'Mark',
    age: '21',
    addresses : [
        { street: '123 Church St', city: 'Miami', cc: 'USA' },
        { street: '123 Mary Av', city: 'Los Angeles', cc: 'USA' }
    ]
}

{
    id: '15',
    name: 'Robin',
    department: 'New Business',
    example: 'robin@example.com'
}

為了能夠充分利用MongoDB的優勢,您必須了解並遵循一些基本的數據庫設計原則。在講解設計方法之前,我們必須首先了解MongoDB存儲數據的結構。

一、 數據如何存儲在MongoDB中

與傳統的RDBMS關係型數據庫不同,MongoDB並沒有表Table,行row和列column的概念。它將數據存儲在集合collections,文檔documents和字段fields中。下圖說明了與RDBMS類比的結構之間的關係:

二、數據庫設計技巧和竅門

2.1.規範化存儲與非規範化存儲

因為MongoDB使用文檔來存儲數據,所以理解“規範化存儲“”和“非規範化存儲”的概念非常重要。

規範化存儲:-規範化意味着將數據存儲到多個集合collections中,並在它們之間設計關聯關係。數據保存之後,更新數據比較容易。但是在讀取數據的時候,規範化存儲的缺點就顯現出來。如果要從多個集合collections查找數據,則必須執行多個查詢,從而使讀取數據的速度變慢。 (比如:將網頁標題、作者、內容分別存儲到不同的collections中)

非規範化存儲:-這種方式將若干對象數據,以嵌套的方式存儲到單個文檔中。它在讀取數據的時候表現更好,但在寫入時會變慢。這種存儲數據的方式還將佔用更多空間。 (比如:將網頁標題、作者、內容分別存儲到同一個collection中)

所以在兩種存儲數據方式之間進行選擇之前,先評估一下你的應用數據庫的使用方式。

  • 如果您有一個不需要頻繁更新的數據,更新的即時一致性不是很重要,但是在讀取時需要良好的性能,那麼非規範化可能是明智的選擇。(比如:我們博客的博文,作者一旦保存之後,幾乎就不在進行頻繁的修改,但是面臨着讀者頻繁的讀取閱讀操作)

  • 如果數據庫中的文檔數據需要不斷的更新,並且您希望在寫入時具有良好的性能,那麼您可能需要考慮規範化存儲。(比如:需要頻繁修改數據的業務類系統)

2.2. 一對多關係

與RDBMS相比,在MongoDB中對“一對多”關係建模需要進行更細粒度的設計。許多初學者陷入將文檔數組嵌入父文檔中的陷阱。正如我們在上文中介紹的,知道何時進行規範化存儲或非規範化存儲是非常重要的。因此設計者需要考慮關係的基數是“一個對少數幾個”還是“一個對多個”?每種關係將具有不同的建模方法。

例如:下面“一個對少數幾個”的建模示例。最好的建模方法是在父文檔(persopn)中嵌入幾個(address):

> db.person.findOne()
{
  name: 'Mark Kornfield',
  ssn: '1223-234-75554',
  addresses : [
     { street: '123 Church St', city: 'Miami', cc: 'USA' },
     { street: '123 Mary Av', city: 'Los Angeles', cc: 'USA' }
  ]
}

在“一個對多個”示例中,我們將考慮設計兩個集合,即產品products集合和零件parts集合。每個零件都有一個“ ObjectID”,該“ ObjectID”將出現在產品集合的引用中。這樣的設計可以讓讀寫性能更高效。

> db.parts.findOne()
{
    _id : ObjectID('AAAA'),
    partno : '1224-dsdf-2215',
    name : 'bearing',
    price: 2.63

> db.products.findOne()
{
    name : 'car',
    manufacturer : 'Ford',
    catalog_number: 2234,
    parts : [     // array of references to Part documents
        ObjectID('AAAA'),    // reference to the bearing above
        ObjectID('F17C'),    // reference to a different Part
        ObjectID('D2AA'),
        // etc
]

2.3.設計模式可視化

儘管MongoDB是schemaless“無模式的”,但仍然存在將集合collections可視化為圖表的方法。能夠查看設計圖,將對您理解和設計MongoDB的方式上產生重大影響。

DbSchema是可以很好地完成可視化設計工作的一個工具。如下圖所示,它將通過讀取集合和文檔來推導架構。此外,您只需單擊就可以修改圖中的對象。在DbSchema中,您還可以為MongoDB創建外鍵,當然僅在本地創建,只用於設計目的。

2.4.智能索引

為了保持數據庫的良好性能,有必要建立智能索引,這將簡化寫入和讀取操作。知道MongoDB的索引優勢和局限性非常重要,MongoDB保留用於排序操作的內存限製為32MB。如果你不使用索引,則排序時數據庫將被迫將所有排序文檔hold在內存裏面,如果達到32M的限制,則數據庫將返回錯誤或空集。

結論

對MongoDB的透徹理解與對數據庫想要實現的目標的清晰了解是良好數據庫設計的秘訣。

歡迎關注我的博客,裏面有很多精品合集

  • 本文轉載註明出處(必須帶連接,不能只轉文字):字母哥博客。

覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創作動力! 。另外,筆者最近一段時間輸出了如下的精品內容,期待您的關注。

  • 《手摸手教你學Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2一本通》
  • 《實戰前後端分離RBAC權限管理系統》
  • 《實戰SpringCloud微服務從青銅到王者》
  • 《VUE深入淺出系列》

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

【其他文章推薦】

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

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

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

※幫你省時又省力,新北清潔一流服務好口碑

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

Swagger之外的選擇

今天給大家安利一款接口文檔生成器——JApiDocs。

swagger想必大家都用過吧,非常方便,功能也十分強大。如果要說swaager有什麼缺點,想必就是註解寫起來比較麻煩。如果我說有一款不用寫註解,就可以生成文檔的工具,你心動了嗎?他就是我們今天的主角——JApiDocs。

下面我們一起來看看如何使用!

一、添加依賴

<dependency>
  <groupId>io.github.yedaxia</groupId>
  <artifactId>japidocs</artifactId>
  <version>1.3</version>
</dependency>

二、配置生成參數

我們新建一個項目,然後隨便寫一個main方法,增加生成文檔的配置,然後運行main方法。

DocsConfig config = new DocsConfig();
config.setProjectPath("F:\\Java旅途\\japi-docs"); // 項目根目錄
config.setProjectName("japi-docs"); // 項目名稱
config.setApiVersion("V1.0");       // 聲明該API的版本
config.setDocsPath("F:\\test"); // 生成API 文檔所在目錄
config.setAutoGenerate(Boolean.TRUE);  // 配置自動生成
Docs.buildHtmlDocs(config); // 執行生成文檔

三、編碼規範

由於JApiDocs是通過解析Java源碼來實現的,因此如果要想實現想要的文檔,還是需要遵循一定的規範。

3.1 類註釋、方法註釋和屬性註釋

如果我們想生成類的註釋,我們可以直接在類上加註釋,也可以通過加@description來生成。

/**
 * 用戶接口類
 */
@RequestMapping("/api/user")
@RestController
public class UserController {}

/**
 * @author Java旅途
 * @Description 用戶接口類
 * @Date 2020-06-15 21:46
 */
@RequestMapping("/api/user")
@RestController
public class UserController {}

如果我們想生成方法的註釋,只能直接加註釋,不能通過加@description來生成。

/**
 * 查詢用戶
 * @param age 年齡
 * @return R<User>
*/
@GetMapping("/list")
public R<User> list(@RequestParam int age){

    User user = new User("Java旅途", 18);
    return R.ok(user);
}

JApiDocs可以自動生成實體類,關於實體類屬性的註釋有三種方式,生成的效果都是一樣的,如下:

/**
 * 用戶名稱
 */
private String name;
/**
 * 用戶年齡
 */
private int age;
// 用戶名稱
private String name;
// 用戶年齡
private int age;
private String name;// 用戶名稱
private int age;// 用戶年齡

他除了支持咱們常用的model外,還支持IOS的model生成效果如下:

​

3.2 請求參數

如果提交的表單是 application/x-www-form-urlencoded 類型的key/value格式,則我們通過@param註解來獲取參數,在參數後面添加註釋,示例如下:

/**
  * @param age 年齡
  */
@GetMapping("/list")
public R<User> list(@RequestParam int age){
    User user = new User("Java旅途", 18);
    return R.ok(user);
}

生成的文檔效果如下:

請求參數

參數名 類型 必須 描述
age int 否 年齡

如果提交的表單是 application/json 類型的json數據格式,如下:

/**
  * @param user
  * @return
  */
@PostMapping("/add")
public R<User> add(@RequestBody User user){
    return R.ok(user);
}

生成的文檔效果如下:

請求參數

{
  "name": "string //用戶名稱",
  "age": "int //用戶年齡"
}

3.3 響應結果

我們知道,如果Controller聲明了@RestController,SpringBoot會把返回的對象直接序列成Json數據格式返回給前端。 JApiDocs也利用了這一特性來解析接口返回的結果,但由於JApiDocs是靜態解析源碼的,因此你要明確指出返回對象的類型信息,JApiDocs支持繼承、泛型、循環嵌套等複雜的類解析。

因此我們不需要再寫註釋,它會根據我們的返回結果進行解析,效果如下:

返回結果:

{
  "code": "int",
  "msg": "string",
  "data": {
    "name": "string //用戶名稱",
    "age": "int //用戶年齡"
  }
}

最終,我們生成的接口文檔,如下:

四、高級配置

4.1 @ApiDoc

如果你不希望把所有的接口都導出,我們可以在配置中設置config.setAutoGenerate(Boolean.FALSE);然後再想要生成的接口上添加@ApiDoc。

@ApiDoc有以下三個屬性:

  • result: 這個可以直接聲明返回的對象類型,如果你聲明了,將會覆蓋SpringBoot的返回對象
  • url: 請求URL,擴展字段,用於支持非SpringBoot項目
  • method: 請求方法,擴展字段,用於支持非SpringBoot項目
@ApiDoc(result = User.class, url = "/api/user/view", method = "post")

4.2 @Ignore

如果你不想導出對象裏面的某個字段,可以給這個字段加上@Ignore註解,這樣JApiDocs導出文檔的時候就會自動忽略掉了。

public class User {
    @Ignore
    private int age;
}

五、總結

JApiDocs就介紹到這裏了,優勢劣勢大家很容易就看出來了。幾乎不需要註釋即可生成接口文檔,僅有的幾個註釋我們也可以通過ide來自動生成。但是JApiDocs不具備swagger在線調試功能。如果有一天JApiDocs支持在線調試后,那時候肯定會有一大波追隨者,畢竟寫代碼的誰喜歡寫多餘的註解!~

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

【其他文章推薦】

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

※新北清潔公司,居家、辦公、裝潢細清專業服務

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

※FB行銷專家,教你從零開始的技巧

我們是如何做go語言系統測試覆蓋率收集的?

工程效能領域,測試覆蓋率度量總是繞不開的話題,我們也不例外。在七牛雲,我們主要使用go語言構建雲服務,在考慮系統測試覆蓋率時,最早也是通過圍繞原生go test -c -cover的能力來構建。這個方案,筆者還曾在 MTSC2018大會上有過專項分享。其實我們當時已經做了不少自動化工作,能夠針對很多類型的代碼庫,自動插樁服務,自動生成TestMain()等方法,但隨着接入項目越來越多,以及後面使用場景的不斷複雜化,我們發現這套還是有其先天局限,會讓後面越來越難受:

  • 程序必須關閉才能收集覆蓋率。如果將這套系統僅定位在收集覆蓋率數據上,這個痛點倒也能忍受。但是如果想進一步做精準測試等方向,就很受局限。
  • 因為不想污染被測代碼庫,我們採取了自動化的方式,在編譯階段給每個服務生成類似main_test.go文件。但這種方式,其最難受的地方在於flag的處理,要知道go test命令本身會調用flag.Parse方法,所以這裏需要自動化的修改源碼,保證被測程序的flag定義,要先於go test調用flag.Parse之前。但是,隨着程序自己使用flag姿勢的複雜化,我們發現越來越難有通用方案來處理這些flag,有點難受。
  • 受限於go test -c命令的先天缺陷,它會給被測程序注入一些測試專屬的flag,比如-test.coverprofile, -test.timeout等等。這個是最難受的,因為它會破壞被測程序的啟動姿勢。我們知道系統測試面對是完整被測集群,如果你需要專門維護一套測試集群來做覆蓋率收集時,就會顯得非常浪費。好鋼就應該用在刀刃上,在七牛雲,我們倡導極客文化,追求用工程師思維解決重複問題。而作為業務效率部門,我們自己更應該走在前列。

也是因為以上的種種考量,我們內部一直在優化這一套系統,到今天這一版,我們已從架構和實現原理上完成了顛覆,能夠做到無損插樁,運行時分析覆蓋率,當屬非常優雅。

Goc – A Comprehensive Coverage Testing System for The Go Programming Language

一圖勝千言:

使用goc run .的姿勢直接運行被測程序,就能在運行時,通過goc profile命令方便的得到覆蓋率結果。是不是很神奇?是不是很優雅?

這個系統就是goc, 設計上希望完全兼容go命令行工具核心命令(go buld/install/run)。使用體驗上,也希望向go命令行工具靠攏:

以下是goc 1.0版本支持的功能:

系統測試覆蓋率收集方案

有了goc,我們再來看如何收集go語言系統測試覆蓋率。整體比較簡單,大體只需要三步:

  • 首先通過goc server命令部署一個服務註冊中心,它將會作為樞紐服務跟所有的被測服務通信。

  • 使用goc build --center="<server>" 命令編譯被測程序。goc不會破壞被測程序的啟動方式,所以你可以直接將編譯出的二進制發布到集成測試環境。

  • 環境部署好之後,就可以做執行任意的系統測試。而在測試期間,可以在任何時間,通過goc profile --center="<server>"拿到當前被測集群的覆蓋率結果。
    是不是很優雅?

goc 核心原理及未來

goc在設計上,拋棄老的go test -c -cover模式,而是直接與go tool cover工具交互,避免因go test命令引入的一系列弊端。goc同樣沒有選擇自己做插樁,也是考慮go語言的兼容性,以及性能問題,畢竟go tool cover工具,原生採用結構體來定義counter收集器,每個文件都有單獨的結構體,性能相對比較可靠。goc旨在做go語言領域綜合性的覆蓋率工具以及精準測試系統,其還有很長的路要走:

  • 基於PR的單測/集測/系統覆蓋率增量分析
  • 精準測試方向,有一定的產品化設計體驗,方便研發與測試日常使用
  • 擁抱各種CICD系統

當前goc已經開源了,歡迎感興趣的同學,前往代碼倉庫查看詳情並Star支持。當然,我們更歡迎有志之士,能夠參与貢獻,和我們一起構建這個有意思的系統。

最後,父親節快樂!

Contact me ?

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

【其他文章推薦】

※新北清潔公司,居家、辦公、裝潢細清專業服務

※別再煩惱如何寫文案,掌握八大原則!

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

※超省錢租車方案

※教你寫出一流的銷售文案?

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

C# 9.0 新特性之只讀屬性和記錄

閱讀本文大概需要 2 分鐘。

大家好,這是 C# 9.0 新特性系列的第 4 篇文章。

熟悉函數式編程的童鞋一定對“只讀”這個詞不陌生。為了保證代碼塊自身的“純潔”,函數式編程是不能隨便“弄髒”外來事物(參數、變量等)的,所以“只讀”對函數式編程非常重要。

為了豐富 C# 對函數式編程支持,較新的 C# 版本引入了一些很有用的新特性。比如 C# 8 中就對 struct 類型的方法增加了 readonly 修飾符支持,被 readonly 修飾的方法是不能修改該方法所在類的屬性的。舉個例子:

public struct FooValue
{
    private int A { get; set; }
    public readonly int IncreaseA()
    {
        A = A + 1; // 報錯
        return A;
    }
}

而 C# 9 又進一步增加了對“只讀”的支持,此次增加了 init-only 屬性和 record 相關特性,下面一一介紹。

Init-only 屬性

我們知道類的屬性有 set 和 get 兩種訪問器,現在 C# 9 增加一種屬性訪問器:init。init 是 set 訪問器的變體,它的作用是使屬性只能在對象初始化的時候對其賦值,之後該屬性就是只讀的,因此叫 init-only 屬性。使用方式如下:

public class Foo
{
    public string PropA { get; init; }
    public string PropB { get; init; }
}

賦值操作:

var foo = new Foo {  PropA = "A", PropB = "B" };
foo.PropA = "AA"; // 報錯,PropA 此時是只讀的!

由於 init 是在初始化階段賦值,所以它可以在類內部修改 readonly 修飾的字段。比如:

public class Foo
{
    private readonly string propA;
    private readonly string propB;

    public string PropA
    {
        get => propA;
        init => propA = (value ?? throw new ArgumentNullException(nameof(propA)));
    }
    public string PropA
    {
        get => propB;
        init => propB = (value ?? throw new ArgumentNullException(nameof(propB)));
    }
}

如果你知道在構造函數中可以對只讀字段/屬性賦值就自然也理解這一點。

記錄 (Record)

做過財務系統的人都知道交易記錄一旦入賬是不能修改的,如果錄入錯誤,就要新錄入一筆負的記錄把之前的紅衝掉,再錄入正確的記錄。應對類似這種只讀記錄的場景,C# 9 引入了 Record(記錄,下文均使用中文的“記錄”)的概念,它用來支持整個對象的只讀特性(即實例化後為只讀)。使用方式如下:

public data class Foo
{
    public string PropA { get; init; }
    public string PropB { get; init; }
}

這裏用了一個 data 關鍵字,表示該類的對象只是純粹的記錄值,它不是可修改的狀態(在函數式編程中,所有的數據修改都是狀態在發生變化)。

上面的太麻煩了,可以這樣簡寫:

public data class Foo
{
    string PropA;
    string PropB;
}

默認屬性都是 public 的,如果實在要改為 private,可以在屬性定義前面加上 private 修飾符。

定位記錄 (Positional Record)

有時候為了初始化更方便,可以定義構造函數來給屬性賦值,初始化時只需要把屬性值按順序傳給構造函數即可,這個操作稱為定位構造(Positional Construction)。同樣,也可以使用解構函數(Deconstructor)來實現屬性的解構,即按照解構函數的參數順序從對象中提取屬性的值,被稱為定位解構(Positional Deconstructor)。實現了定位構造或定位解構的記錄稱為定位記錄(Positional Record)。下面是一個定位記錄的實現:

public data class Foo
{
    string PropA;
    string PropB;
    public Foo(string propA, string propB)
      => (PropA, PropB) = (propA, propB);
    public void Deconstruct(out string propA, out string propB)
      =>  (propA, propB) = (PropA, PropB);
}

這個寫法太麻煩了,可以直接簡寫為:

public data class Foo(string PropA, string PropB);

這樣簡短一句代碼,其內部默認實現了 init-only 自動屬性,且同時為所有屬性定義了構造函數和解構函數。

使用示例:

var foo = new Foo("AA", "BB");  // 構造定位
var (a, b) = foo;               // 解構定位

可以想象,記錄的大部分使用場景,以上簡寫的寫法能滿足需求。若有特殊場景,就不能簡單,需要進行自定義修改其默認行為。

with 表達式

當處理不可變數據時,若要生成不同的狀態,一個常見的場景是在一條舊記錄基礎上拷貝一條新的記錄。比如我們要修改 Foo 對象的 PropA 屬性,我們就要拷貝該對象生成一個新的對象。這個操作在函數式編程中被稱為“非破壞性修改 (non-destructive mutation)”。為了支持記錄這個操作,C# 9 引入了 with 表達式,它可以很方便在一條原有記錄基礎上創建一條新記錄。示例:

var other = foo with { PropA = "AA" };

with 表達式內部其實是通過一個默認的 protected 構造函數來實現的,大致如下:

protected Foo(Foo original)
{
    // 拷貝 original 的所有字段
}

如果默認實現的字段拷貝不符合你的需求,你也可以手動實現這個構造函數。

今天就分享到這裏,敬請期待一下篇關於 C# 9 新特性的文章!

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

【其他文章推薦】

※教你寫出一流的銷售文案?

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

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!