<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>MSDN 台灣部落格</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/msdntaiwan/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/msdntaiwan/feed.xml</link>
    <description>提供最新微軟開發平台的新聞、技術文章</description>
    <lastBuildDate>Mon, 22 May 2017 10:19:26 GMT</lastBuildDate>
    <language>zh_TW</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Visual Studio for Mac：現在全面上市！</title>
      <link>https://docs.microsoft.com/archive/blogs/msdntaiwan/visual-studio-for-mac%EF%BC%9A%E7%8F%BE%E5%9C%A8%E5%85%A8%E9%9D%A2%E4%B8%8A%E5%B8%82%EF%BC%81</link>
      <pubDate>Mon, 22 May 2017 16:34:26 GMT</pubDate>
      <dc:creator><![CDATA[Dora Chen]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/msdntaiwan/?p=14315</guid>
      <description><![CDATA[2017 年 5 月 10 日我們在微軟 Build 大會中宣布，Visual Studio for Mac 2017 正式版開放。

Visual Studio for Mac 2017 是替...]]></description>
      <content:encoded><![CDATA[2017 年 <span>5 </span>月<span> 10 </span>日我們在微軟 <span>Build </span>大會中宣布，<a href="https://www.visualstudio.com/vs/visual-studio-mac/?utm_medium=Blog&amp;utm_source=VS_blog_5_10_MI&amp;utm_campaign=msbuild_2017">Visual Studio for Mac 2017 正式版</a>開放。

Visual Studio for Mac 2017 是替 <span>Mac </span>系統原生打造的全功能 <span>IDE</span>，可用於開發，調適和測試應用程式甚至是遊戲。讓同時擁有<span> PC </span>和 <span>Mac </span>的開發團隊可以倚賴一致的解決方案與專案，完美共用程式碼。所有 <span>IDE </span>提供的都是為 <span>Mac </span>原生打造，讓所有 <span>Mac </span>使用者能夠輕易的上手<span>Visual Studio</span>。

<!--more-->
<h3><strong>開發行動、網頁、雲端和遊戲應用</strong></h3>
<h3>行動開發透過 <span>C# </span>和<span> .NET</span></h3>
<img src="https://msdnshared.blob.core.windows.net/media/2017/05/2017-05-10-VSMac-GA-Post-mobileDevWorkload.png" />

Visual Studio for Mac 除了提供 <span>Xamarin </span>行動開發極佳的使用體驗，從整合設計、程式碼撰寫、到打包及發佈應用程式之外，還提供以下輔助：
<ul>
 	<li>數以百萬計的工程師喜愛的 <span>C# 7</span></li>
 	<li>完整的 <span>.NET API </span>百分之百涵蓋了 <span>Android, iOS, tvOS, watchOS </span>和 <span>macOS </span>開發 <span>API</span>。</li>
 	<li>Forms API 的概念最大化共享程式碼</li>
 	<li>可以取得 Nuget.<span>org </span>上成千上萬的 <span>.NET </span>程式庫以加速您的行動開發</li>
 	<li>透過 <span>LLVM </span>優化編譯器，高度優化原生程式碼</li>
</ul>
&nbsp;
<h3>使用 ASP.NET Core 和 Azure 進行網站開發</h3>
自從我們在去年<span>11</span>月首次發布 <span>Visual Studio for Mac </span>的預覽之後，我們便一直致力於將 <span>Windows </span>版 <span>Visual Studio </span>的網站編輯工具移植到 <span>Mac </span>版上。這次的最新版本，您將可獲得完整的 <span>ASP.NET Core </span>和 <span>HTML5</span>、<span>CSS3</span>、<span>JavaScript </span>等前端語言支援，以建立網站為主的應用程式。

<img src="https://msdnshared.blob.core.windows.net/media/2017/05/2017-05-10-VSMac-GA-Post-webEditors.png" />

當您的網頁應用已完美優化並且即將發行時，您不需要離開 IDE 即可使用最新的 Publish to Azure 工具直接發行到 Azure 上。

<img src="https://msdnshared.blob.core.windows.net/media/2017/05/2017-05-10-VSMac-GA-Post-addAppService.png" width="421" height="301" class="" />
<h3></h3>
<h3>使用 <span>Unity </span>開發遊戲</h3>
Build 的最新消息，Visual Studio for Mac 幫助您透過 C#, .NET 和 Unity 開發遊戲應用。

<img src="https://msdnshared.blob.core.windows.net/media/2017/05/2017-05-10-VSMac-GA-Post-UnityPhotoEnterprise.png" />

搭配 Unity 5.6.1 使用，您將可以在 <span>IDE </span>中建置和偵錯遊戲應用，包含以下：
<ul>
 	<li>支援專案，輕鬆瀏覽和搜尋您的腳本</li>
 	<li>從遊戲引擎可自動完成方法調用</li>
 	<li>依附於 <span>Unity </span>編輯器的一鍵除錯功能</li>
</ul>
&nbsp;
<h3>在 <span>Mac </span>和<span> PC </span>之間無縫地工作</h3>
Mac 版 <span>Visual Studio </span>幫助您與團隊的其他人協同合作，無論他們使用的是 <span>Mac </span>還是<span> PC</span>。解決方案和專案在<span> Mac </span>版或 <span>Windows </span>版 <span>Visual Studio </span>中都可運作，讓來自不同的開發團隊輕鬆的跨越作業系統，在同個專案上一起合作。這也代表您可以輕易的在不同機器間來回，而不會損失效率。

&nbsp;
<h3>為 <span>Mac </span>量身打造</h3>
Visual Studio for Mac 是一個專為 <span>Mac </span>打造的全新 <span>IDE </span>體驗，並不是直接從 <span>Windows </span>版的 <span>Visual Studi</span>o 移植而來。這意味著 <span>UI </span>體驗上就跟您使用其他的<span> MacOS </span>應用一樣。不僅是基本元素像是按鈕、文字呈現方式和圖示。我們還將開發人員的工作流程優化成 <span>Mac </span>開發人員所期望的，讓他們沒有任何違和感，以減少花費心力在適應上。

<img src="https://msdnshared.blob.core.windows.net/media/2017/05/2017-05-10-VSMac-GA-Post-ideFullScreen.png" />

&nbsp;
<h3>搶先預覽即將釋出的新功能</h3>
這次的發表只是個開始，所以今天我們也聊聊預覽中的超棒新功能，並且會盡快提供於Alpha 頻道上。以下是沒有被列在 <span>Stable </span>版本中的預覽功能，還期待您試用並給予我們回饋：
<ul>
 	<li>支援 <span>Docker</span>：支援在 <span>Docker </span>容器中部署和偵錯 <span>.NET Core </span>和 ASP.<span>NET Core</span></li>
 	<li>支援 <span>Azure Functions</span>：在您的<span>Mac</span>上開發、偵錯和部署 <span>Azure Functions</span>。</li>
 	<li>以 <span>IoT </span>裝置為目標：使用 <span>C# </span>程式碼和<span> Xamarin </span>開發 <span>IoT </span>裝置<span>(</span>像是 <span>Android Things) </span>適用的應用。</li>
</ul>
想要嘗試這些預覽功能，您可以<span><a href="https://docs.microsoft.com/en-us/visualstudio/mac/update?utm_source=VS4MacGA&amp;utm_medium=blogpost&amp;utm_campaign=build2017">訂閱 Mac 版 Visual Studio 中的 Alpha 頻道</a></span>。

<span> </span>
<h3>試試看吧！並且讓我們知道您的想法</h3>
如果您已經安裝了<span> </span>Visual Studio for Mac 的預覽版，請先確保您已更新到最新版本。如果您還沒安裝過預覽版，快前往 <span><a href="https://docs.microsoft.com/en-us/visualstudio/mac/update?utm_source=VS4MacGA-endofPost&amp;utm_medium=blogpost&amp;utm_campaign=build2017">VisualStudio.com</a></span> 下載最新釋出的版本。想知道更多有關於這次發表的內容，可以到 <span><a href="https://www.visualstudio.com/en-us/news/releasenotes/vs2017-mac-relnotes?utm_source=VS4MacGA-endofPost&amp;utm_medium=blogpost&amp;utm_campaign=build2017">release notes</a></span> 查看。

我們對這次的發表感到非常驕傲，同時也想知道您的看法——拜託！告訴我們您的回饋。您可以使用 <span>Visual Studio for Mac </span>版本中的 <span><a href="https://docs.microsoft.com/en-us/visualstudio/mac/report-a-problem">Report a Problem</a></span> 或是<span> “Provide a Suggestion” (</span>在<span> Help menu </span>裡<span>) </span>給予我們回饋。或者加入<span>Visual Studio Mac </span>版本社群論壇中的對話。

&nbsp;

快試試看吧！

&nbsp;

Miguel

&nbsp;

本文翻譯自  <a href="https://blogs.msdn.microsoft.com/visualstudio/2017/05/10/visual-studio-for-mac-now-generally-available/">Visual Studio for Mac: now generally available</a>]]></content:encoded>
    </item>
    <item>
      <title>【Build 2017】更多平台、更多選擇、更加強大的 Visual Studio Mobile Center</title>
      <link>https://docs.microsoft.com/archive/blogs/msdntaiwan/%E3%80%90build-2017%E3%80%91%E6%9B%B4%E5%A4%9A%E5%B9%B3%E5%8F%B0%E3%80%81%E6%9B%B4%E5%A4%9A%E9%81%B8%E6%93%87%E3%80%81%E6%9B%B4%E5%8A%A0%E5%BC%B7%E5%A4%A7%E7%9A%84-visual-studio-mobile-center</link>
      <pubDate>Mon, 22 May 2017 16:14:13 GMT</pubDate>
      <dc:creator><![CDATA[Dora Chen]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/msdntaiwan/?p=14306</guid>
      <description><![CDATA[去年秋天，我們推出了 Visual Studio Mobile Center（預覽版），這是一項雲端服務，旨在幫助開發人員管理 App 的生命週期，並以更快的速度發佈更高品質的...]]></description>
      <content:encoded><![CDATA[去年秋天，我們推出了<span> Visual Studio Mobile Center</span>（預覽版），這是一項雲端服務，旨在幫助開發人員管理<span> App </span>的生命週期，並以更快的速度發佈更高品質的<span> App</span>。今天，我們要宣布一些更振奮人心的升級：我們不但加強了服務的功能，並且還將 <span>Mobile Center </span>擴及新的群眾和平台。

<!--more-->
<h3><strong>重點新功能</strong></h3>
<h3>Windows 新功能支援</h3>
<img src="https://msdnshared.blob.core.windows.net/media/2017/05/MobileCenter-BUILD2017-WindowsTest.png" />

起初我們設計了 <span>Mobile Center</span>，就是想幫助所有應用程式開發人員更快地構建和運送更高品質的<span> App</span>。我們希望每個平台上的每位開發人員都成為一流的工程師。在今早 (台灣時間 5/10 晚上 10 點) 的<span> Microsoft Build 2017 </span>中，我們已經為<span> iOS </span>和<span> Android </span>添加了對<span> Windows </span>應用程式的支援。從今天開始，通用<span> Windows </span>平台（<span>UWP</span>）的開發人員可以存取 <span>Mobile Center </span>的建置、發佈、分析和全新的推送服務，而當機及測試服務將在後半年推出。

<strong> </strong>
<h3>全新的推送服務</h3>
<img src="https://msdnshared.blob.core.windows.net/media/2017/05/MobileCenter-BUILD2017-pushnotificationsx1920.gif" />

對於一個強大的<span> CI / CD </span>管道，能快速、可靠地提供軟體是重要的關鍵。<span>Mobile Center </span>構建、測試和分發服務旨在使其成為每個開發人員工作流程的一部分。我們的當機報告和分析服務可確保您了解每個版本的品質和使用情況，然而我們從開發人員那裡得知他們最常見的需求是：可以使用 <span>Mobile Center </span>分析數據來推送訊息，以確保正確的最終用戶能即時收到通知。這加強了與終端用戶從他們一開始登入到後來表現出積極參與度的連結。

&nbsp;

透過我們新的推送服務，<span>Mobile Center </span>開發人員可以在正確的時機向特定的用戶組發送有特定的訊息。客戶可以根據十幾種不同的屬性（包括裝置、語言、設備型號、螢幕尺寸和時區）來創建劃分，甚至還有更多其他的功能。如果您想嘗試新的推送服務，請透過我們<span> App </span>的內部支援與我們聯繫。

&nbsp;
<h3>VSTS 及 Bitbucket 整合</h3>
<img src="https://msdnshared.blob.core.windows.net/media/2017/05/MobileCenter-BUILD2017-repos.png" />

我們是<a href="https://github.com/Microsoft?utm_source=VSMC&amp;utm_medium=blogpost&amp;utm_campaign=build2017"><span> GitHub </span>的超級愛用者</a>，所以它成為我們去年 <span>11 </span>月推出 <span>Mobile Center </span>建置服務的首選。儘管如此，我們也相信靈活性和選擇性，所以今天我們很自豪地發佈<span> Visual Studio Team Services </span>和<span> Bitbucket </span>的<span> git </span>套件庫支援。所有的套件庫和服務都具有相同的功能，包括我們強大的內建推送功能和全新的啟動測試。

<strong> </strong>
<h3>全新測試框架：XCUITest 和 Espresso</h3>
有些使用預覽版的客戶告訴我們他們很喜歡我們的測試服務，但是他們想在更熟悉的特定平台框架中編寫測試。於是我們採納了他們的意見，我們現在支援 <span>XCUITest </span>和<span> Espresso</span>、<span>iOS </span>和<span> Android </span>的原生測試框架。現在，開發人員可以使用自己的語言撰寫他們的自動化<span> UI </span>測試，並將現有測試移植到 <span>Mobile Center </span>測試。

&nbsp;
<h3>佈署到 App 商店</h3>
自從預覽版第一次發佈以來，<span>Mobile Center</span>提供了一個強大的<span> beta </span>測試發佈服務，將成功的構建自動發送給測試人員。開發人員表示，他們會喜歡這種相同的機制，讓他們將應用程式部署到<span> App </span>商店和公司門戶。

&nbsp;

透過我們針對發佈服務新增的功能，只要開發人員對於他們的<span> App </span>品質有信心，他們可以將最新版本直接推廣到<span> App </span>商店或公司門戶。如今，您已經可以使用 <span>Google Play </span>進行此項操作，我們也將盡快連結到<span> Intune</span>、<span>App Store </span>以及<span> Windows Store </span>。

<img src="https://msdnshared.blob.core.windows.net/media/2017/05/MobileCenter-BUILD2017-StoreImage.png" />

&nbsp;
<h3>HockeyApp 與 <span>Mobile Center</span></h3>
Mobile Center將是下一代的<span> HockeyApp</span>。 從今天開始，我們推出了針對<span> HockeyApp </span>用戶過渡計劃的第一步：使用 <span>Mobile Center </span>內<span> HockeyApp </span>的現有<span> App</span>，分析當機報告和分析數據，並連接到構建、測試和推送服務。

目前在<span> HockeyApp </span>和<span>Mobile Center</span>共同存有<span> App</span>、公司、協作者和測試人員，因此開發人員可以在<span> HockeyApp </span>應用程式中使用行動中心的新服務，而不影響<span> HockeyApp </span>的使用體驗。在<span> HockeyApp </span>所做的更新也會在<span>Mobile Center</span>更新，以確保一致性，並將來自<span> HockeySDK </span>傳入的<span> App </span>數據一併傳輸到 <span>Mobile Center</span>。

&nbsp;

我們也將在不久之後對<span> HockeyApp </span>用戶推出此功能，當我們準備將其擴展到<span> App </span>時，開發人員屆時會收到<span> Email </span>通知。

&nbsp;
<h3><strong>我們的下一步</strong></h3>
全新的行動平台、測試框架、推送服務和套件庫支援只是個開始<span> - </span>我們還會推出更多功能及服務。<span> App </span>商店及安全私人入口網站的部署將在未來幾個月內推出，同時還將增加<span> UWP </span>支援，就如同 <span>HockeyApp </span>和雲端測試服務，以及全新的雲端開發服務。現在就<a href="https://mobile.azure.com/signup?utm_medium=Blog&amp;utm_source=VS_blog_5_11_KB&amp;utm_campaign=msbuild_2017">開始註冊</a>吧！

&nbsp;

Keith Ballinger - 行動開發人員雲端服務專案管理師 <span><a href="https://twitter.com/KeithBa">@KeithBa</a></span>

Keith 先前是微軟在<span> 2016 </span>年<span> 3 </span>月收購的<span> Xamarin </span>產品副總裁。<span>Keith</span>在創業、工程和產品管理方面皆具有強大的背景，亦在他原先的<span> .NET </span>團隊中擔任產品經理。<span> 2007</span>年<span> Keith </span>離開了微軟，成立了初創公司，也共同創立了幾家手機初創公司。<span> 2012</span>年，他帶領團隊創建了<span> SmartPay</span>，為一款行動支付應用程式，每年處理超過<span> 10 </span>億美元的交易量。 在<span> Xamarin </span>之前，<span>Keith </span>是<span> YC </span>資助的初創公司<span> - Standard Treasury </span>的首席架構師，建立了<span> API </span>優先的銀行。 他亦是兩本關於編程的書籍作者，「<span>.NET Web Service: Architecture and Implementation</span>」以及「<span>Special Edition: Using ASP</span>」的合著者。

&nbsp;

本文翻譯自 <a href="https://blogs.msdn.microsoft.com/visualstudio/2017/05/11/more-platforms-more-choices-more-power-visual-studio-mobile-center-at-build/">More Platforms, More Choices, More Power: Visual Studio Mobile Center at Build</a>]]></content:encoded>
    </item>
    <item>
      <title>Visual Studio 2017 全面支援 Python 開發環境</title>
      <link>https://docs.microsoft.com/archive/blogs/msdntaiwan/visual-studio-2017-python</link>
      <pubDate>Wed, 26 Apr 2017 15:03:58 GMT</pubDate>
      <dc:creator><![CDATA[MSDN Taiwan]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/msdntaiwan/?p=14255</guid>
      <description><![CDATA[今天是 Visual Studio 2017 的正式發行日， 你可以透過網站 ( launch.visualstudio.com ) 看到相關訊息以及加入即時活動。除了 Visual Studio...]]></description>
      <content:encoded><![CDATA[<span>　　</span>今天是 Visual Studio 2017 的正式發行日， 你可以透過網站 ( <a href="https://launch.visualstudio.com/">launch.visualstudio.com</a> ) 看到相關訊息以及加入即時活動。除了 Visual Studio 2017 發行的這個大新聞之外，我們同時也要宣佈一個有趣的訊息。

<span>　　</span>對於喜歡使用最新軟體的開發者來說，當 Visual Studio 預覽的版本被確定之後就較少在更新這件事，是令人感到沮喪的。因為大家都知道的，一旦軟體正式發佈之後，更新就不會這麼頻繁了。而在 Visual Studio 2017，我們將安裝的使用體驗視為最重要的改善，新增了某些特定開發環境的使用情境，讓許多產品服務透過更簡單的方式提供給大家。這也代表著，未來將會看到更多更新頻繁的軟體版本，並且比過去能提供給更廣泛的開發者，以及更專注於某些開發情境的使用。我們也會提供早期試用者 ( early adopters ) 比其他使用者搶先使用到一些新功能。

&nbsp;
<h4><strong>Visual Studio 2017 和 Visual Studio Preview 相關介紹</strong></h4>
<img width="163" height="162" class="wp-image-14265 alignright" alt="brandvisualstudioide2017rc_40x" src="https://msdnshared.blob.core.windows.net/media/2017/04/BrandVisualStudioIDE2017RC_40x.png" /><span>　　</span>除了 Visual Studio 2017 之外，我們也同時發布 Visual Studio Preview。其中包含我們截至目前最新釋出的一些功能，也就是下一個版本的 Visual Studio 的提早預覽版。讓你可以在正式、穩定版本發佈前的幾週就搶先使用到最新、最棒的改善服務。
<p style="text-align: left"><span>　　</span>在過去，如果你想要安裝 Visual Studio 的預覽版本，會需要安裝在兩台不同的機器上。不過現在 Visual Studio 2017，我們讓大家能夠同時安裝正式版以及預覽版在同一台電腦上。而當預覽版本的安裝不能使用的時候，正式版仍然能提供給你需要的功能，而且你可以在同一台電腦上面同時開啟兩個版本。</p>
<span>　　</span>簡單來說，如果你已經安裝 Visual Studio 2017，這個方式將會再幫你安裝另一個 Visual Studio，你將會有兩個不同的開發環境、設定，這些都可以透過同樣的 Visual Studio 安裝設定完成。所有你在 Visual Studio 2017 可以使用的功能，在 Visual Studio Preview 都能夠使用，所以唯一會需要兩個版本共存的使用情境就是你會需要客服功能的時候，這部分可以點產品頁瞭解更多。
<!--more-->

&nbsp;
<h4><strong>為何透過這個部落格發佈？</strong></h4>
<span>　　</span>你也許會想說，為什麼我們在 python 的部落格發布 Visual Studio Preview 的消息，而不是在 Visual Studio 主要發布的部落格。主要原因就是因為：在 Visual Studio Preview 版本裡，我們首度加入了 Python 的開發環境。

<span>　　</span>這些功能和過去你在 “ Python 開發工具 “ ( Visual Studio Python Tools ) 使用的功能都相同，不過現在放進 Visual Studio 2017 的是更新更全面的版本。現在就讓我們來看一些比較主要的更新，我們也將會在未來幾週釋出更多更新也更深入的消息。<span>　　</span>

&nbsp;
<h4><strong>安裝</strong></h4>
<span>　　</span>當在安裝程序當中加入支援 Python 的開發環境之後，我們就可以透過安裝程序當中方便使用的部分。比如在下圖當中，你可以看到 Python 開發環境這個選項已被選取，而一系列相關的選項也變成可選取的狀態。這些選項除了推薦的 Visual Studio 功能之外，還有官方認為對開啊者可能有所幫助的第三方套件。

<span>　　</span>首先你會看到一系列的Python版本可供選取，同樣的 Continuum Analytics (基于 Python 的數據解决方案提供商)在 Anaconda 也有相對應的支援。這些都是從外部網站直接連結的，因此你能夠過 Visual Studio 享有和原網站安裝相同的功能，只不過我們透過簡易的選取框來呈現。

<span>　　</span>“ Python開發工具 “ ( Visual Studio Python Tools ) 其實是 Visual Studio 的正規 C++工具和編譯器，不過我們在這邊談的會專注在 Python 3.5 或是更新的版本，如果想瞭解先前版本的部分請看先前的文章。

<span>　　</span>我們將會在以下討論 Cookiecutter 的範本支援，以及其他在 Visual Studio 當中專為 Azure 或者 Windows IOT Core 所使用的功能。你將會知道你是否會需要這些功能。

<span>　　</span>（其他補充：如果你已經安裝了 Python 3.6 的版本，必須在安裝時取消勾選此選取框，否則在移除 Visual Studio 的時候，也會同時移除 Python。)

&nbsp;
<h4><strong>互動式視窗</strong></h4>
<img width="300" height="185" class="size-full wp-image-14277 alignleft" alt="interactive-300x185" src="https://msdnshared.blob.core.windows.net/media/2017/04/Interactive-300x185.png" />由於大部份的使用者花了許多時間在使用互動視窗上，所以我們在這版本做了一些改善，讓互動視窗的功能更加強大。未來在部落格會有關於更新的更多詳盡介紹，現在可以先看一下相關的摘要：

＃你可以使用 ctrl 和 enter 鍵，將訊息在編輯區內送至互動區

＃你可以用 #%% 將程式碼標記，並將他們一次送出

＃你可以新增數個你所需要的互動視窗，並在其中依需求選擇不同的 Python 環境。

&nbsp;
<h4><strong>Cookiecutter</strong></h4>
<span>　　</span>當你安裝好 Cookiecutter 的模板支援，你將會在 “ 檔案 ” 下方，新增專案和新增項目目錄列表看到新的選項，這些將會打開 Cookiecutter 的探索視窗。透過這個功能會幫助你搜尋跟使用線上的範本。你還不太熟悉 Cookiecutter 嗎？可以點選我們之前的文章來瞭解更多。

&nbsp;
<h4><strong>Azure</strong></h4>
<img width="308" height="176" class=" wp-image-14285 alignleft" alt="azureitemtemplates-300x171" src="https://msdnshared.blob.core.windows.net/media/2017/04/AzureItemTemplates-300x171.png" />針對 Visual Studio 2017，我們將更全面的支援 Python 專案的新增以及在 Azure 上的部署。在早些版本，我們提供較簡要的功能讓一切能快速上手，但後來我們聽到一些使用者回饋，說希望我們能更完善的支援維護複查度較高的網站使用。

我們預期這過程會花一些時間，也期待你們能加入我們，協助讓產品在對的方向上。以下是目前從舊版更新的新功能：

&nbsp;

＃推薦使用 Azure 應用程式網站擴充功能

＃我們現在使用的 Python Nuget 套件的模板語法在 Azure 雲端服務使用。

＃部署指令現在也變成簡易複製即可，現在我們也已經新增新模板來協助你能夠管理你的網站設定 ( web configuration )。

（在這部分我們仍然有一個已知的問題，你應該在安裝的時候選擇 “ Azure 雲端服務核心元件 ” 以取得完整的 Azure 支援，關於這部分我們將會盡快修復此問題。)

&nbsp;
<h4><strong>我們未來的計畫是什麼？</strong></h4>
<span>　　</span>Visual Studio Preview 現在仍是預覽階段，所以你可以預期在未來幾個月 Visual Studio 新版本發佈時，支援所有功能的狀況，包含 Python 開發環境 ( 資料科學開發環境 )。到時候你可以選擇移除 Visual Studio 預覽版本，或是留著，繼續使用下一階段最新的預覽更新。

<span>　　</span>我們將會持續不斷的開發 Python 的支援，且和以往一樣，我們所有的開發狀況都會更新在 Github 上，所以如果你想要讓我們知道對你來說最重要的功能、需求，請到 Github 上面發 Issue 讓我們知道，我們同時也歡迎大家提供程式或者文獻上的貢獻。

&nbsp;

(原文出處：<a href="https://blogs.msdn.microsoft.com/pythonengineering/2017/03/07/python-support-in-vs2017/">Released: Python support in Visual Studio 2017</a>）

<hr />

🌟 更多最新文章及資訊 &gt;&gt;<span style="color: #ff0000"> <a href="https://www.facebook.com/msdn.taiwan/">MSDN 台灣粉絲專頁</a> </span>&amp; <a href="https://blogs.msdn.microsoft.com/msdntaiwan/">MSDN 台灣部落格</a>

🌟 <span>更多熱門課程影片 &gt;&gt; <span style="color: #ff0000"><a href="https://channel9.msdn.com/">Channel 9 免費課程平台</a></span></span>]]></content:encoded>
    </item>
    <item>
      <title>宣佈釋出 Visual F# 工具每日編譯版本</title>
      <link>https://docs.microsoft.com/archive/blogs/msdntaiwan/visual-f</link>
      <pubDate>Wed, 26 Apr 2017 15:03:30 GMT</pubDate>
      <dc:creator><![CDATA[MSDN Taiwan]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/msdntaiwan/?p=14225</guid>
      <description><![CDATA[在我們部落格之前的文章 (Announcing F# 4.1 and the Visual F# Tools for Visual Studio...]]></description>
      <content:encoded><![CDATA[<span>　　</span>在我們部落格之前的文章 (<span><a href="https://blogs.msdn.microsoft.com/dotnet/2017/03/07/announcing-f-4-1-and-the-visual-f-tools-for-visual-studio-2017-2/">Announcing F# 4.1 and the Visual F# Tools for Visual Studio 2017</a>) </span>中有提到過，我們很快就會針對 <span>Visual F# tools </span>提供新的釋出方式。而那個時機已到！讓我們來回顧一下，每日編譯版本是指在 <span>master </span>分支中，每次成功建置的 <span>commit</span>，通過持續整合系統的驗證成功後所得到的版本，即稱為：每日編譯版本。
<!--more-->

<span>　　</span>每日編譯版本會包含新功能、<span>Bug </span>的修正以及現有功能的改善，這些改善也終將會擠身於正式的 <span>Visual Studio </span>更新或釋出。<span></span>針對 <span>VS 2017 RTM</span>，我們強烈推薦使用最新的每日編譯版本 <span>Visual F# Tools</span>，在目前最新的每日編譯版本中，已經包含了許多 <span>Bug </span>的修正、效能改善與加入了一些跟 <span>VS 2017 </span>正式版本相比起有更好使用體驗的新功能。

<hr />

<span>　　</span>目前共有兩種方法可以取得每日編譯版本，在這邊特別提醒：以下的方式只會針對 <span>F# IDE Tools </span>安裝最新的每日編譯版本，其餘如：<span>F# </span>編譯器、<span>FSI </span>或 <span>FSharp.Core </span>均不會受到影響。

&nbsp;
<h4><span> </span><strong>通過 </strong><strong>Visual Studio </strong><strong>中的擴充功能和更新 </strong><strong>(</strong><strong>推薦方式</strong><strong>)</strong></h4>
這是我們推薦使用的方式，以下的步驟將會帶你走過如何設定擴充功能和更新的來源指向到<span>Visual F# Tools</span>的每日編譯版本來源，設定完成後，每當有新的<span>VSIX</span>發布後，即會自動從<span>Visual Studio</span>的到通知。<span></span>

&nbsp;
<ol>
 	<li>開啟 工具→擴充功能與更新</li>
 	<li>點擊位於左下角的<span>”</span>變更您的<span>[</span>擴充功能和更新<span>]</span>的設定”按鈕</li>
</ol>
<span> <img src="https://msdnshared.blob.core.windows.net/media/2017/04/129.png" alt="1" width="461" height="246" class="aligncenter size-full wp-image-14226" /></span>
<ol start="3">
 	<li>點擊位於<span>”</span>其他擴充組件庫<span>”</span>旁的<span>”</span>加入<span>”</span>按鈕</li>
</ol>
<img src="https://msdnshared.blob.core.windows.net/media/2017/04/217-800x463.png" alt="2" width="800" height="463" class="aligncenter size-medium wp-image-14235" />

<span> </span>
<p style="padding-left: 30px">於名稱的文字方塊中，填入任何你想取的名字，然後在連結的文字方塊中，輸入以下<span>URL</span>：<span>https://dotnet.myget.org/F/fsharp/vsix</span></p>
<img src="https://msdnshared.blob.core.windows.net/media/2017/04/317.png" alt="3" width="647" height="155" class="aligncenter size-full wp-image-14245" />
<ol start="4">
 	<li><span></span>點擊 <span>”</span>套用<span>” </span>按鈕</li>
 	<li>點擊 <span>”</span>確定<span>” </span>按鈕</li>
</ol>
根據您電腦的組態，或許需要一小段時間讓 <span>Visual Studio </span>更新組件庫來源；一旦完成後，即可前往 <span>” </span>工具→擴充功能與更新<span>” </span>視窗，會有一提醒通知 <span>Visual F# Tools </span>有可用更新！

<span> </span>
<h4><strong>手動安裝每日編譯版本 </strong><strong>VSIX</strong></h4>
假如您不想將 <span>Visual Studio </span>的更新來源設為每日編譯版本，您還是可以透過手動安裝 <span>VSIX </span>方式來取得每日編譯版本；您可以透過此方式來選擇性使用每日編譯版本。
<ol>
 	<li>前往：<span><a href="https://dotnet.myget.org/feed/fsharp/package/vsix/VisualFSharp">https://dotnet.myget.org/feed/fsharp/package/vsix/VisualFSharp</a></span></li>
 	<li>下載最新的 <span>VSIX (</span>或是任何你想要的版本)</li>
 	<li>下載完成後，透過雙擊的方式開啟安裝；您必須關閉 <span>Visual Studio </span>來進行安裝</li>
</ol>
當您的程式碼於之前的每日編譯版本中運行正常，而在最新的每日編譯版本中遇到問題時，此種方式是一個很好的解決方法。

<span> </span>
<h4><strong>解除安裝每日編譯版本並回復至穩定版本</strong></h4>
假如您希望可以回復到穩定版本，最簡單的方式是透過 <span>Visual Studio Developer Command Prompt</span>，您可以透過在開始視窗搜尋 <span>” Visual Studio Developer Command Prompt ” </span>開啟，然後執行以下指令

<span> </span>

<span>VSIXInstaller.exe /u:VisualFSharp</span>

<span> </span>

這將解除安裝每日編譯版本，並自動回復到您所安裝的 <span>Visual F# Tools </span>最新穩定版本。我們非常高興能夠有對 <span>Visual F# Tools </span>每日編譯版本，我們鼓勵您去嘗試並將使用後的心得與建議回饋給我們，尤其是針對新功能的部分。

您可以透過 <span><a href="https://github.com/Microsoft/visualfsharp">Visual F# Github repository</a> </span>來追蹤我們針對功能、<span>Bug </span>與改進的進度。

<span> </span>謝謝

<span> </span><span>Visual F# </span>團隊

&nbsp;

(原文出處：<a href="https://blogs.msdn.microsoft.com/dotnet/2017/03/14/announcing-nightly-releases-for-the-visual-f-tools/">Announcing Nightly Releases for the Visual F# Tools</a>)

<hr />

🌟 更多最新文章及資訊 &gt;&gt;<span style="color: #ff0000"> <a href="https://www.facebook.com/msdn.taiwan/">MSDN 台灣粉絲專頁</a> </span>&amp; <a href="https://blogs.msdn.microsoft.com/msdntaiwan/">MSDN 台灣部落格</a>

🌟 <span>更多熱門課程影片 &gt;&gt; <span style="color: #ff0000"><a href="https://channel9.msdn.com/">Channel 9 免費課程平台</a></span></span>]]></content:encoded>
    </item>
    <item>
      <title>【案例分享】Raygun 有了.NET Core，App 效能監控的處理能力比起原本的 Node.js 提高了 20 倍！</title>
      <link>https://docs.microsoft.com/archive/blogs/msdntaiwan/case-study-raygun-net-core-app</link>
      <pubDate>Tue, 18 Apr 2017 10:51:54 GMT</pubDate>
      <dc:creator><![CDATA[MSDN Taiwan]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/msdntaiwan/?p=14125</guid>
      <description><![CDATA[高效能、即時應用程式監控
開發人員都知道，幾乎所有的軟體都有一些小缺陷。但只有約 1 % 的終端用戶回報問題 ;...]]></description>
      <content:encoded><![CDATA[<h4><span style="color: #000080"><strong>高效能、即時應用程式監控</strong></span></h4>
開發人員都知道，幾乎所有的軟體都有一些小缺陷。但只有約 <span>1 % </span>的終端用戶回報問題 <span>; </span>即使他們做了，通常還是不會提供開發人員解決問題所需的完整資訊。<span>Raygun </span>雲端的錯誤與毀損回報平台正面臨著這樣的挑戰。它默默地監控網頁和行動應用，每日檢測數十億個錯誤數據點和毀損事件，然後透過詳細的診斷報告即時通知開發人員。
<!--more-->

該產品的核心是使用微軟 <span>.NET </span>技術和 <span>Visual Studio </span>工具。而其 <span>API </span>節點應用程式，負責從客戶端接收數據、進行驗證並審核通過，則是採用<span> Linux </span>上的 <span>Node.js </span>技術以支持應用能夠快速地調整規模大小。

隨著時間的推移，<span>Raygun </span>工程師注意到<span> Node.js API </span>的效能降低了。<span>Raygun </span>聯合創始人兼技術長<span> Jeremy Boyd </span>說：「隨著新版本的出現，我們發現<span> Node.js </span>作為一個框架已經變得越來越慢、負擔越來越重。」 工程師考慮要增加伺服器數量，但是即使雲端伺服器的成本相對較低，大幅增加還是會導致成本上升。

&nbsp;
<h4><span style="color: #000080"><strong>用 C＃編寫 Linux 應用程式</strong></span></h4>
Raygun 開發人員決定專注於最大化現有的<span> API </span>節點的效能。當公司知道微軟即將發佈<span> .NET Core</span>，一個開源的 <span>.NET </span>平台，允許開發人員使用<span> C# </span>編寫<span> Linux </span>應用程式時，他們就立刻開始著手使用。<span>Raygun </span>執行長兼創始人 <span>John-Daniel Trask </span>提到「我們的程式碼庫大部分都是以<span> C# </span>撰寫，所以我們的工程師能夠使用它來對<span> API </span>層做修改，表示有更多的人可以在此專案上工作。」

兩個開發人員花了兩個星期將<span> API </span>移植到 <span>.NET Core</span>，緊接著驗證測試工作負載的效能。當他們滿意地發現 <span>.NET Core </span>版本的<span> API </span>是正確的，他們啟動了一組運行新軟體的節點，然後將這些節點加入現有生產環境的節點叢集中。當<span> .NET Core </span>節點成功運行，<span>Raygun </span>才逐漸汰換原先的<span> Node.js </span>節點。

&nbsp;
<p style="text-align: center"><strong>「透過<span> .NET Core</span>，我們可以使用相同大小的伺服器，</strong></p>
<p style="text-align: center"><strong>從原本<span> Node.js </span>節點每秒處理 <span>1000 </span>個請求提升到每秒處理 <span>20,000 </span>個請求。」</strong></p>
<p style="text-align: center"><strong> - John-Daniel Trask</strong><strong>，<span>Raygun </span>執行長兼聯合創始人</strong></p>
&nbsp;

<strong><img src="https://msdnshared.blob.core.windows.net/media/2017/04/7b2b5e67e3db4a09bcfb0c85378082b4-800x528.jpeg" alt="7b2b5e67e3db4a09bcfb0c85378082b4" width="600" height="396" class="aligncenter wp-image-14116" /></strong>

&nbsp;
<h4><span style="color: #000080"><strong>提高了 20 倍的處理能力</strong></span></h4>
效能的改善是立竿見影的。<span>Trask </span>表示：「透過<span> .NET Core</span>，我們可以使用相同大小的伺服器，從原本<span> Node.js </span>節點每秒 <span>1000 </span>個請求提升到每秒 <span>20,000 </span>個請求。」處理能力增加了 <span>20 </span>倍，意味著<span> Raygun </span>可以將自身伺服器數量減少 <span>60 %</span>。<span>Raygun </span>可以更進一步降低伺服器數量、以降低成本，保持更高的生產量進而更有效地處理突發尖峰狀況。<span>Boyd </span>說：「當我們需要時，備用盒已經啟動並準備好加載，還能同時節省資金，完全是個意料之外的好處。」

&nbsp;

<span> 👉  <a href="https://dot.net/core">了解並準備開始使用 .NET Core</a></span>

&nbsp;

（本文出自：<a href="https://customers.microsoft.com/en-us/story/raygun">App performance monitoring provider increases throughput by 2,000 percent with .NET Core</a>）]]></content:encoded>
    </item>
    <item>
      <title>【案例分享】採用 .NET Core，Acano Manager 獲得了 Linux 的擴展能力和開源彈性能力</title>
      <link>https://docs.microsoft.com/archive/blogs/msdntaiwan/net-core-acano-manager</link>
      <pubDate>Wed, 12 Apr 2017 12:07:59 GMT</pubDate>
      <dc:creator><![CDATA[MSDN Taiwan]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/msdntaiwan/?p=14115</guid>
      <description><![CDATA[調整規模以滿足視訊會議的蓬勃
在過去幾年中，視訊會議與及語音會議在需求和功能方面都大幅成長。VQ Communications 透過其 Acano Manager...]]></description>
      <content:encoded><![CDATA[<h4><span style="color: #000080"><strong>調整規模以滿足視訊會議的蓬勃</strong></span></h4>
在過去幾年中，視訊會議與及語音會議在需求和功能方面都大幅成長。<span><a href="https://www.vqcomms.com/resources/2017-03-22/the-path-to-big/">VQ Communications</a></span> 透過其<span> Acano Manager </span>軟體，已經在第一時間見證了市場的蓬勃發展。<span>Acano Manager </span>控制<span> Cisco Meeting Server</span>，實現視訊會議，提供用戶和會議場合，並提供操作人員待命管理儀表板、以及報告和分析。
<!--more-->

部署的規模從相對較小，數百個視訊通話，到更大的系統，數千個同時進行的視訊和語音通話。<span>VQ Communications </span>開始注意到，在<span> Linux VM </span>設備上運行 <span>Mono </span>版本的<span> Acano Manager </span>，連接到<span> Cisco Meeting Server</span>叢集時會出現問題。

VQ Communications 的軟體架構師 <span>Jonathan Channon </span>說：「每個<span> Cisco Meeting Server</span>都可以承載數百個高清視訊通話或數千個語音通話。但我們發現當一個叢集中有超過兩台 <span>Cisco Meeting Server </span>的時候，<span>Mono </span>版本的 <span>Acano Manager </span>開始會有網路<span> IO </span>的問題，網站對<span> Meeting Server </span>的請求就會失敗，而且無法恢復。如果我們無法可靠地發送指令，那我們就完蛋了。」

&nbsp;
<h4><span style="color: #000080"><strong>一個程式碼庫，橫跨兩個平台</strong></span></h4>
當微軟宣布推出適用於高度可擴展系統的輕量級跨平台框架<span> - .NET Core</span>，<span>VQ </span>將其視為能解決他們<span> Linux </span>可擴展性問題的潛在方案。大概在<span> 9 </span>個月內，<span>VQ </span>就將<span> .NET </span>版本的<span> Acano Manager 2 </span>移植到了<span> .NET Core ; </span>也包含資助<span> Nancy, </span>開源網站框架移植到<span> .NET Core</span>。

藉由<span> .NET Core </span>版本的<span> Acano Manager</span>，客戶可以在<span> Linux </span>或<span> Windows </span>上獲得原生操作系統功能之外，更獲得效能的提升。<span>VQ Communications </span>的執行長<span> Mike Horsley </span>表示：「將<span> Acano Manager </span>放在<span> .NET Core </span>上，讓我們可以為<span> Windows </span>和<span> Linux </span>客戶提供相同的程式碼庫。」

&nbsp;
<h4><span style="color: #000080"><strong>開源帶給我們更大的自由</strong></span></h4>
.NET Core 的另一大優點是，它允許開發人員選擇他們想要使用的任何工具。

Channon 說道：「<span>.NET Core </span>跨平台的優勢，允許開發人員更自由地開發產品，因為不論是<span> macOS</span>、<span>Linux </span>或<span> Windows</span>，最後都能運行<span> .NET Core</span>，這可以提高生產力並縮短產品的上市時間。」

Horsley 認為<span> .NET Core </span>在開源方面帶來的效益，既能解決問題又能為新技術鋪路。他說：「如果我們在堆疊中發現問題，可以直接深入研究以找出問題，現在我們可以完全存取 <span>.NET Core </span>的程式碼庫這件事實在是太棒了。另外，我們現在也在其他平台上都採用<span> C</span>＃，我們可以實現 <span>Docker </span>這樣的技術，提供創新和創造價值的巨大潛力。」

&nbsp;

<span>👉 <a href="https://dot.net/core"> 了解並準備開始使用 .NET Core</a></span>

<strong> </strong>
<p style="text-align: center"><strong>「<span>.NET Core </span>跨平台的優勢，允許開發人員更自由地開發產品，</strong></p>
<p style="text-align: center"><strong>因為不論是<span> macOS</span>、<span>Linux </span>或<span> Windows</span>，最後都能運行 </strong></p>
<p style="text-align: center"><strong><span>.NET Core</span>，</strong><strong>這可以提高生產力並縮短產品的上市時間。」</strong></p>
<p style="text-align: center"> - Jonathan Channon：軟體架構師，ASP .Net MVP</p>
&nbsp;

<img src="https://msdnshared.blob.core.windows.net/media/2017/04/04aceda02200496aa84e8c349b2b9e53-800x429.jpeg" alt="04aceda02200496aa84e8c349b2b9e53" width="636" height="341" class="aligncenter wp-image-14145" />

&nbsp;

&nbsp;

<span>（本文出自：<a href="https://customers.microsoft.com/en-us/story/vqcommunications">Acano Manager gains Linux scalability and open-source flexibility with .NET Core</a></span><span>）</span>]]></content:encoded>
    </item>
    <item>
      <title>C# 7.0 新功能介紹</title>
      <link>https://docs.microsoft.com/archive/blogs/msdntaiwan/c7-new-features</link>
      <pubDate>Mon, 10 Apr 2017 16:26:48 GMT</pubDate>
      <dc:creator><![CDATA[MSDN Taiwan]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/msdntaiwan/?p=14165</guid>
      <description><![CDATA[這篇文章介紹了 C# 7.0 的新語法。這也是在 2017/03/07 發表的 Visual Studio 2017 中眾多新功能之一。

在 C# 7.0...]]></description>
      <content:encoded><![CDATA[<h1 id="c-7-0-"><img src="https://msdnshared.blob.core.windows.net/media/2017/04/C7.0-01-800x319.jpg" alt="c7-0-01" width="1066" height="425" class="aligncenter wp-image-14186" /></h1>
這篇文章介紹了 C# 7.0 的新語法。這也是在 2017/03/07 發表的 <a href="https://blogs.msdn.microsoft.com/visualstudio/2017/03/07/announcing-visual-studio-2017-general-availability-and-more/">Visual Studio 2017</a> 中眾多新功能之一。

在 C# 7.0 新增了許多支援的語法，重點擺在改善效能、精簡程式碼、以及資料取用幾個部分。其中最主要的功能之一是 Tuples, 能讓你更容易的一次傳回多筆結果，另外 Pattern Match 新語法則簡化了撰寫針對特定資料型態與條件的程式碼。除此之外，C# 7.0 也包含了其他重要的各種新語法支援。希望所有的這些改變都能讓你更愉快的寫出有效率，簡潔的程式碼，同時也更有生產力。<!--more-->

如果你很好奇我們如何導引出這些功能的設計過程，可以查閱 <a href="https://github.com/dotnet/csharplang">C# Language design GitHub</a> 網站，在那邊可以找到設計說明文件，設計提案，與大量的討論內容。

如果你覺得這篇文章內容很熟悉，也許是你曾經看過去年八月份 (2016/08) 發表過的版本。在 C# 7.0 最終定案的版本中有少數的異動，這些
異動都來自先前版本的眾多優良的回饋意見。

希望你喜歡 C# 7.0, 盡情享受它, Happy Hacking !!

<strong>Mads Torgersen</strong>, C# Language PM

<hr />

<blockquote>譯註:

為了更清楚的表達這篇文章的內容，翻譯時我採用意譯，而非逐句翻譯。我也會適時補充字句，讓文章要表達的意義更清楚完整。

太多專有名詞，翻成中文反而對閱讀沒有幫助，因此這部分我保留原文，但是我會在譯註的部分額外補充說明。
期望這樣能更清楚的讓讀者了解內容。</blockquote>

<hr />

<h4><img alt="Microsoft-logo" src="https://msdnshared.blob.core.windows.net/media/2016/07/Microsoft-logo-e1468823486155-25x25.png" width="23" height="23" class="" /> <span style="color: #333399">本篇文章，帶您看到以下 C# 7.0 新功能<a id="A"></a>：</span></h4>
<ul>
 	<li><span style="color: #000080"><a href="#A">Out 變數 ( out variables )</a></span></li>
 	<li><span style="color: #000080"><a href="#B">Pattern Matching (模式匹配 )</a></span></li>
 	<li><span style="color: #000080"><a href="#C">使用 pattern 的 is 表達式</a></span></li>
 	<li><span style="color: #000080"><a href="#D">使用 patterns 的 switch 陳述式</a></span></li>
 	<li><span style="color: #000080"><a href="#E">Tuples</a></span></li>
 	<li><span style="color: #000080"><a href="#F">Desconstruction (解構 )</a></span></li>
 	<li><span style="color: #000080"><a href="#G">Local functions ( 區域函式 )</a></span></li>
 	<li><span style="color: #000080"><a href="#H">改良的 Literal</a></span></li>
 	<li><span style="color: #000080"><a href="#I">Ref returns 與 ref locals</a></span></li>
 	<li><span style="color: #000080"><a href="#J">非同步的傳回型別</a></span></li>
 	<li><span style="color: #000080"><a href="#K">更廣泛的 expression bodies 成員</a></span></li>
 	<li><span style="color: #000080"><a href="#L">Throw 運算式</a></span></li>
</ul>

<hr />

<h2 id="out-out-variables-">Out 變數 (out variables)</h2>
在先前版本的 C# 中，<code>out</code> 參數的使用並不如我們期望的那麼的流暢。呼叫帶有 <code>out</code> 參數的 <em>method</em> 之前，你必須先宣告變數
並且將它當作 <code>out</code> 的參數傳遞才行。通常你不會 (也不需要) 先初始化這變數 (變數的內容會在被呼叫的 <em>method</em> 內覆寫)，同時你也不能使用 <code>var</code> 的方式來宣告它, 你必須很明確的指定這變數的完整型別:
<pre><code class="lang-csharp"><span style="color: #00ccff">public void</span> <span style="color: #ff0000">PrintCoordinates</span>(Point p)
{
    <span style="color: #00ccff">int</span> x, y; // have to "predeclare"
    p.<span style="color: #ff0000">GetCoordinates</span>(<span style="color: #00ccff">out</span> x, <span style="color: #00ccff">out</span> y);
    <span style="color: #ff0000">WriteLine</span>($<span style="color: #99cc00">"({x}, {y})"</span>);
}
</code></pre>
在 C# 7.0，新增了 <strong>out</strong> 變數，可以在傳遞 <code>out</code> 參數時同時宣告這個變數:
<pre><code class="lang-csharp"><span style="color: #00ccff">public void</span> <span style="color: #ff0000">PrintCoordinates</span>(Point p)
{
    p.<span style="color: #ff0000">GetCoordinates</span>(<span style="color: #00ccff">out int</span> x,<span style="color: #00ccff"> out int</span> y);
    <span style="color: #ff0000">WriteLine</span>($<span style="color: #99cc00">"({x}, {y})"</span>);
}
</code></pre>
請留意，這個變數在包含它本身的 { } 封閉區塊範圍內，所以接續宣告後面的程式碼可以直接使用這些變數。
多數類似型態的語法沒有指定可視範圍，該變數可視範圍就等同於宣告他的區塊範圍。

通常 <code>out</code> 變數都會直接被宣告為傳遞的參數，編譯器通常能直接判定參數的型別為何 (除非 method 包含數個互相衝突
的 <em>overloads</em> 而無法判定)，因此可以直接使用 <code>var</code> 的方式來宣告它:
<pre><code class="lang-csharp">p.<span style="color: #ff0000">GetCoordinates</span>(<span style="color: #00ccff">out var</span> x, <span style="color: #00ccff">out var</span> y);
</code></pre>
一般來說，我們常常在 <code>Try...</code> 這類的使用模式中用到 <code>out</code> 參數，它會傳回 <code>true</code> 或是 <code>false</code> 來代表執行成功與否，同時藉著 <code>out</code> 參數來傳回成功執行後的結果:
<pre><code class="lang-csharp"><span style="color: #00ccff">public void</span> <span style="color: #ff0000">PrintStars</span>(<span style="color: #00ccff">string</span> s)
{
    <span style="color: #00ccff">if</span> (<span style="color: #00ccff">int</span>.<span style="color: #ff0000">TryParse</span>(s, <span style="color: #00ccff">out var</span> i)) { <span style="color: #ff0000">WriteLine</span>(<span style="color: #00ccff">new</span> string(<span style="color: #99cc00">'*'</span>, i)); }
   <span style="color: #00ccff"> else</span> { <span style="color: #ff0000">WriteLine</span>(<span style="color: #99cc00">"Cloudy - no stars tonight!"</span>); }
}
</code></pre>
如果你不在意某個 <code>out</code> 參數的傳回結果，可以使用 <code>_</code> 代表忽略它<a id="B"></a>:
<pre><code class="lang-csharp">p.<span style="color: #ff0000">GetCoordinates</span>(<span style="color: #00ccff">out var</span> x, <span style="color: #00ccff">out </span>_); // I only care about x
</code></pre>
<h2 id="pattern-matching-">Pattern Matching (模式匹配)</h2>
C# 7.0 開始引入了 <strong>patterns</strong> (模式) 的概念。抽象的來說，他是可以判定資料是否具備一定 "形狀"(Shape) 的語法元素，並從該數值之中提取需要的資訊。
<blockquote>譯註:
Shape, 代表資料的 "形狀", 精確的來說包含資料本身型別包含哪些成員? 這些成員的數值是否落在預期的範圍?
patterns 可以讓判斷資料 "形狀" 的程式碼更為簡潔明確。</blockquote>
舉例來說，C# 7.0 支援的 <em>patterns</em> 有這幾種:
<ul>
 	<li><em>Constant Patterns</em> (常數模式, 以 <code>c</code> 表示，c 是 C# 的常數表達式), 測試輸入的數值是否與 c 相等。</li>
 	<li><em>Type Patterns</em> (類型模式, 以 <code>T x</code> 表示，T 代表型別，而 x 是識別名稱), 測試輸入的數值是否屬於類別 T? 如果是的話就把輸入的數值放到類型為 T 的變數 x 中。</li>
 	<li><em>Var Patterns</em> (變數模式, 以 <code>var x</code> 表示, x 是識別名稱), 這種模式下永遠會匹配成功，此時 x 的型別與輸入的數值相同，這模式下只是簡單的把輸入的數值放到 x 之中。</li>
</ul>
這些只是計畫中的第一步 - <em>pattern</em> (模式) 是 C# 新型態的語法元素，我們期望未來能繼續新增更多的功能。

在 C# 7.0 我們用 <em>pattern</em> 來增強兩種既有的語法結構:
<ul>
 	<li><em>is expression</em> (<em>is</em> 表達式) 現在可以在右方加上 <em>pattern</em>，在之前則只能定義型別。</li>
 	<li>switch 陳述式中的 case 子句，現在可以比對模式是否符合，過去則只支援常數數值<a id="C"></a>。</li>
</ul>
在未來的 C# 我們會增加更多適用 <em>pattern</em> 的語法。
<h2 id="-pattern-is-">使用 <em>pattern</em> 的 is 表達式</h2>
來看看使用 <em>constant patterns</em> 與 <em>type patterns</em> 的 <em>is expression</em> 使用範例:
<pre><code class="lang-csharp"><span style="color: #00ccff">public void</span> <span style="color: #ff0000">PrintStars</span>(<span style="color: #00ccff">object</span> o)
{
    <span style="color: #00ccff">if</span> (o <span style="color: #00ccff">is null</span>) <span style="color: #00ccff">return</span>;     // constant pattern "null"
    <span style="color: #00ccff">if</span> (!(o <span style="color: #00ccff">is int</span> i)) <span style="color: #00ccff">return</span>; // type pattern "int i"
    <span style="color: #ff0000">WriteLine</span>(<span style="color: #00ccff">new</span> string(<span style="color: #99cc00">'*'</span>, i));
}
</code></pre>
如所見，<strong>pattern</strong> 變數 - 由 <em>pattern</em> 引入的變數，跟前面介紹的 <code>out</code> 變數非常相似，你可以宣告在表達式之中，而且可以直接就近在同可是範圍內直接使用他。

跟 <code>out</code> 變數很相似的地方是，模式變數是可變動的，我們常將 <code>out</code> 變數與 <em>pattern</em> 變數，統稱為 <em>expression</em> 變數。

<em>Patterns</em> 常與 <code>Try...</code> <em>method</em> 一起使用<a id="D"></a>:
<pre><code class="lang-csharp"><span style="color: #00ccff">if</span> (o <span style="color: #00ccff">is int </span>i <span style="color: #800000">||</span> (o <span style="color: #00ccff">is string</span> s <span style="color: #800000">&amp;&amp;</span> <span style="color: #00ccff">int</span>.<span style="color: #ff0000">TryParse</span>(s, <span style="color: #00ccff">out</span> i)) { /* use i */ }
</code></pre>
<h2 id="-patterns-switch-">使用 <em>patterns</em> 的 switch 陳述式</h2>
在 C# 7.0，我們也擴大了 switch 陳述式的應用範圍:
<ul>
 	<li>switch 陳述式現在可以運用在所有型別 (不再只限於基本類型)</li>
 	<li><em>patterns</em> 可以用在 case 子句</li>
 	<li>case 子句可以附加條件判斷式</li>
</ul>
這邊有對應的範例程式碼:
<pre><code class="lang-csharp"><span style="color: #00ccff">switch</span>(shape)
{
    <span style="color: #00ccff">case</span> Circle c:
        <span style="color: #ff0000">WriteLine</span>($<span style="color: #99cc00">"circle with radius {c.Radius}"</span>);
        <span style="color: #00ccff">break</span>;
  <span style="color: #00ccff">  case </span>Rectangle s when (s.Length == s.Height):
    <span style="color: #ff0000">    WriteLine</span>($<span style="color: #99cc00">"{s.Length} x {s.Height} square"</span>);
        <span style="color: #00ccff">break</span>;
    <span style="color: #00ccff">case</span> Rectangle r:
       <span style="color: #ff0000"> WriteLine</span>($<span style="color: #99cc00">"{r.Length} x {r.Height} rectangle"</span>);
        <span style="color: #00ccff">break</span>;
   <span style="color: #00ccff"> default</span>:
        <span style="color: #ff0000">WriteLine</span>(<span style="color: #99cc00">"&lt;unknown shape&gt;"</span>);
        <span style="color: #00ccff">break</span>;
   <span style="color: #00ccff"> case null</span>:
      <span style="color: #00ccff">  throw new</span> ArgumentNullException(<span style="color: #ff0000">nameof</span>(shape));
}
</code></pre>
這裡有幾個 switch 陳述式新增的擴充功能:
<ul>
 	<li>case 子句的順序是重要的:
就如同 catch 子句一樣，多個 case 子句之間不再是沒有順序關聯的，而第一個符合條件的 case 子句會被選中。這點非常重要，拿上一個範例程式碼來說，代表正方形的這個 case 子句 (譯註: <code>case Rectangle s when (s.Length == s.Height):</code>) 應該要排在代表長方形的 case 子句 (<code>case Rectangle r:</code>) 前面，結果才會正確。另外，就像 catch 子句一樣，編譯器可以標示出永遠無法執行到的程式碼來協助你。在這之前，你無法也不需要指定多個 case 之間的評估順序，所以這並不是個破壞性的改變 (breaking change)。</li>
 	<li>default 子句永遠會最後才評估:
即使在上述的例子中，null case 子句被擺在最後，他仍然會在 default 子句之前被檢查。這樣的設計是為了與現有的 switch 陳述句保持相容。然而，好的做法通常會明確的將 default 子句擺在最後面。</li>
 	<li>擺在最後面的 null case 子句並不會無法被被執行到:
因為 <em>type patterns</em> (類型模式) 依循 <em>is expression</em> 的例子，不會與 null 子句匹配。這可以確保 null 子句不會不小心被任何的 <em>type patterns</em> (類型模式) 給搶走，你必須更清楚該如何處理這種狀況 (或是把它留給 default 子句來處理)<a id="E"></a>。</li>
</ul>
由 case ... 引進的 pattern 變數 ，他的可視範圍只限於對應的 switch 區段。
<h2 id="tuples">Tuples</h2>
想要從一個 method 傳回一個以上的傳回值是蠻常見的狀況。但是目前 C# 版本對這需求能提供的作法都不夠好。現有的作法有:
<ul>
 	<li><code>out</code> 參數:
使用上很累贅 (即使在前面的部分已經介紹了改良的語法)，而且這方式也無法搭配 <em>async method</em> 一起使用。</li>
 	<li>使用 <code>System.Tuple&lt;...&gt;</code> 型別來傳回值:
需要手動配置一個 <em>tuple</em> 物件，同時也需要寫些冗長的 code 才能辦到。</li>
 	<li>替每個 <em>method</em> 都自訂專屬的傳回值型別:
得額外寫大量的 code 來完成這件事，但是目的只是暫時將多個數值組合起來而已。</li>
 	<li>使用 <em>dynamic</em> 來傳回匿名的型別 (<em>anonymous types</em>):
無法做到靜態型別檢查，同時將會付出很高的效能代價。</li>
</ul>
為了讓這件事做得更好，C# 7.0 新增了 <strong>tuple types</strong> 及 <strong>tuple literals</strong> 的語法:
<pre><code class="lang-csharp">(<span style="color: #00ccff">string</span>, <span style="color: #00ccff">string</span>, <span style="color: #00ccff">string</span>) <span style="color: #ff0000">LookupName</span>(<span style="color: #00ccff">long</span> id) // tuple return type
{
    ... // retrieve first, middle and last from data storage
  <span style="color: #00ccff">  return</span> (first, middle, last); // tuple literal
}
</code></pre>
這 <em>method</em> 現在能更有效率的傳回三個字串型別的傳回值了，這範例將三個字串包成一個 <em>tuple</em>。
呼叫這 <em>method</em> 的程式碼將會收到回傳的 <em>tuple</em> 物件，且能透過 <em>tuple</em> 物件個別存取這些封裝在內的資料:
<pre><code class="lang-csharp"><span style="color: #00ccff">var</span> names <span style="color: #800000">=</span><span style="color: #ff0000"> LookupName</span>(id);
<span style="color: #ff0000">WriteLine</span>($<span style="color: #99cc00">"found {names.Item1} {names.Item3}."</span>);
</code></pre>
其中 <code>Item1</code> 等等，為 <em>tuple</em> 內的元素預設的名稱，這方法能正常運作, 但是這命名方式終究不能很能清楚表達用途。所以你願意的話可以明確的替它們指定更適合的名稱:
<pre><code class="lang-csharp">(<span style="color: #00ccff">string</span> first, <span style="color: #00ccff">string</span> middle, <span style="color: #00ccff">string</span> last) <span style="color: #ff0000">LookupName</span>(<span style="color: #00ccff">long</span> id) // tuple elements have names
</code></pre>
現在這個 <em>tuple</em> 的元素能用更貼切的名稱來存取之內的元素了:
<pre><code class="lang-csharp"><span style="color: #00ccff">var</span> names<span style="color: #800000"> =</span> <span style="color: #ff0000">LookupName</span>(id);
<span style="color: #ff0000">WriteLine</span>($<span style="color: #99cc00">"found {names.first} {names.last}."</span>);
</code></pre>
你也可以直接在 <em>tuple literals</em> 內指定元素的名稱:
<pre><code class="lang-csharp"><span style="color: #00ccff">    return</span> (first: first, middle: middle, last: last); // named tuple elements in a literal
</code></pre>
一般來說，你可以互相指派 <em>tuple</em> 的變數，而不用管他的名稱為何: 只要個別的元素都可以被指派，<em>tuple</em> 型別可以自由轉換為其他的 <em>tuple</em> 型別。

<em>Tuples</em> 是 <em>value types</em>, 而且它包含的元素都很單純的被標示為 <code>public</code>, 都是可異動的欄位 (<em>mutable fields</em>)。它們是 "數值相等" (<em>value equality</em>) 的，
意思是只要兩個 <em>tuples</em> 的所有對應的元素都是相等的 (而且 hash code 也必須相同)，那這兩個 <em>tuples</em> 就是相等的 (hash code 也會相同) 。

除了傳回多個傳回值的情況之外，在其他地方 <em>tuples</em> 也很有用。例如，如果你需要一個包含多個 Key 的 <code>Dictionary</code>，你只需要拿 <em>tuple</em> 當作 <code>Dictionary</code> 的 Key 就可以了。如果你需要在 <code>List</code> 內的一個元素放置多個不同的數值，只要使用 <em>tuple</em> 型別並且搜尋這個 <code>List</code>。在這些情況中，<em>tuple</em> 都能正常運作。

<em>Tuples</em> 的實作必須依靠底層的泛型結構型別 (<em>generic struct types</em>): <code>ValueTuple&lt;...&gt;</code>。如果你使用的 target framework 版本還未包含它，你只需要透過 NuGet 取得他們即可<a id="F"></a>:
<ul>
 	<li>在 "方案總管" 內的 "專案" 上按右鍵，選擇 "管理 NuGet 套件..."</li>
 	<li>選擇 "瀏覽" 頁籤，同時在 "套件來源" 項目中選擇 "nuget.org"</li>
 	<li>搜尋 "System.ValueTuple" 並安裝</li>
</ul>
<h2 id="desconstruction-">Desconstruction (解構 )</h2>
另一個使用 <em>tuples</em> 的方式是將他們 <em>deconstruct</em> (解構)。<strong>Deconstructing declaration</strong> (解構宣告) 是用來將 <em>tuple</em> (或是其他值) 裡面的部分拆解並個別指派到其他新的變數用的語法:
<pre><code class="lang-csharp">(<span style="color: #00ccff">string</span> first, <span style="color: #00ccff">string</span> middle, <span style="color: #00ccff">string</span> last) <span style="color: #800000">=</span> <span style="color: #ff0000">LookupName</span>(id1); // deconstructing declaration
<span style="color: #ff0000">WriteLine</span>($<span style="color: #99cc00">"found {first} {last}."</span>);
</code></pre>
在 <em>deconstructing declaration</em> (解構宣告) 中，可以在個別的變數上使用 <code>var</code>:
<pre><code class="lang-csharp">(<span style="color: #00ccff">var</span> first, <span style="color: #00ccff">var</span> middle, <span style="color: #00ccff">var</span> last)<span style="color: #800000"> =</span> <span style="color: #ff0000">LookupName</span>(id1); // var inside
</code></pre>
甚至你可以在括號外面只用單一一個 <code>var</code>:
<pre><code class="lang-csharp"><span style="color: #00ccff">var</span> (first, middle, last) <span style="color: #800000">=</span> <span style="color: #ff0000">LookupName</span>(id1); // var outside
</code></pre>
你也可以透過 <strong>deconstructing assignment</strong> (解構指派) 將 <em>tuple</em> 解構後指派到一個既有的變數:
<pre><code class="lang-csharp">(first, middle, last) <span style="color: #800000">= </span><span style="color: #ff0000">LookupName</span>(id2); // deconstructing assignment
</code></pre>
<em>Deconstruction</em> 不只適用於 <em>tuple</em>，任何型別只要它包含 <em>deconstructor</em> (解構式, 無論是定義
在 instance method 或是 extension method 都可以) ，就可以被解構:
<pre><code class="lang-csharp"><span style="color: #00ccff">public void</span> <span style="color: #ff0000">Deconstruct</span>(<span style="color: #00ccff">out</span> T1 x1, ..., <span style="color: #00ccff">out</span> Tn xn) { ... }
</code></pre>
在這個 <em>deconstructor</em> 裡定義的所有 <code>out</code> 參數，就是該型別物件解構後的所有項目。
(為何在這邊我們使用 <code>out</code> 參數，而不直接傳回 <em>tuple</em> ? 因為這樣就可以讓你為不同數量的
變數，分別定義多個 <em>overloads</em> (多載))
<pre><code class="lang-csharp"><span style="color: #00ccff">class</span> Point
{
    <span style="color: #00ccff">public int</span> X { <span style="color: #00ccff">get</span>; }
    <span style="color: #00ccff">public int</span> Y { <span style="color: #00ccff">get</span>; }

    <span style="color: #00ccff">public</span> <span style="color: #ff0000">Point</span>(<span style="color: #00ccff">int</span> x, <span style="color: #00ccff">int</span> y) { X <span style="color: #800000">=</span> x; Y <span style="color: #800000">=</span> y; }
    <span style="color: #00ccff">public void</span> <span style="color: #ff0000">Deconstruct</span>(out int x, <span style="color: #00ccff">out int</span> y) { x <span style="color: #800000">=</span> X; y <span style="color: #800000">=</span> Y; }
}

(<span style="color: #00ccff">var</span> myX,<span style="color: #00ccff"> var</span> myY) <span style="color: #800000">=</span> <span style="color: #ff0000">GetPoint</span>(); // calls Deconstruct(out myX, out myY);
</code></pre>
你可以用這樣常見的模式，讓 <em>constructor</em> 與 <em>deconstructor</em> 的參數對稱排列。
就如同 <code>out</code> 變數的語法，我們允許你在 <em>deconstructor</em> 中 "忽略" 你不在意的 <code>out</code> 參數:
<pre><code class="lang-csharp">(<span style="color: #00ccff">var</span> myX, _) <span style="color: #800000">=</span> <span style="color: #ff0000">GetPoint</span>(); // I only care about myX
</code></pre>
<blockquote>譯註: 請勿將這裡介紹的 <em>deconstructor</em> 與一般物件導向語言 (如: C++, C# 都有) 常見的 <em>descructor</em> 搞混了。
這個段落介紹的 C# 解構式 (deconstructor), 是定義物件如何 "拆解" 為多個獨立的變數。拆解後原物件仍然存在。
而 C# 與 <em>constructor</em> (建構式) 作用相反的 <em>descructor</em> (解構函式), 則是定義物件要被銷毀前必須執行的動作。
兩者的中文譯名都同樣是 "解構" 請特別留意<a id="G"></a>。
對於 C# <em>descructor</em> 的說明，可以參考: <a href="https://msdn.microsoft.com/en-us/library/66x5fx1b.aspx">https://msdn.microsoft.com/en-us/library/66x5fx1b.aspx</a></blockquote>
<h2 id="local-functions-">Local functions (區域函式)</h2>
有時，輔助函式只有在使用他的函式內才有意義。現在這種情況下，你可以在其他函式內宣告 <strong>local functions</strong> (區域函式):
<pre><code class="lang-csharp"><span style="color: #00ccff">public int</span><span style="color: #ff0000"> Fibonacci</span>(<span style="color: #00ccff">int</span> x)
{
    <span style="color: #00ccff">if</span> (x <span style="color: #800000">&lt;</span> <span style="color: #800080">0</span>) <span style="color: #00ccff">throw new</span> ArgumentException(<span style="color: #99cc00">"Less negativity please!"</span>, <span style="color: #ff0000">nameof</span>(x));
    <span style="color: #00ccff">return</span> <span style="color: #ff0000">Fib</span>(x).current;

    (<span style="color: #00ccff">int</span> current, <span style="color: #00ccff">int</span> previous) <span style="color: #ff0000">Fib</span>(<span style="color: #00ccff">int</span><span style="color: #800080"> i</span>)
    {
        <span style="color: #00ccff">if</span> (i <span style="color: #800000">==</span> <span style="color: #800080">0</span>) <span style="color: #00ccff">return</span> (<span style="color: #800080">1</span>, <span style="color: #800080">0</span>);
        <span style="color: #00ccff">var</span> (p, pp)<span style="color: #800000"> =</span> <span style="color: #ff0000">Fib</span>(i <span style="color: #800080">- 1</span>);
        <span style="color: #00ccff">return</span> (p <span style="color: #800000">+</span> pp, p);
    }
}
</code></pre>
在 <em>local function</em> (區域函式) 內，可以直接使用封閉區塊內的 <em>parameters</em> (參數) 與 <em>local variables</em> (區域變數)，用法及規則就跟 <em>lambda 運算式</em> 的用法一樣。

舉例來說，<em>iterator method</em> 通常外面都需要包覆另一個 <em>non-iterator method</em> ，用來在呼叫時做參數檢查 (<em>iteraotr</em> 在這時並不會執行，而是在 <code>MoveNext()</code> 被呼叫時才會啟動)。這時 <em>local function</em> 就非常適合在這裡使用:
<pre><code class="lang-csharp"><span style="color: #00ccff">public</span> IEnumerable&lt;T&gt; <span style="color: #ff0000">Filter</span><span style="color: #800000">&lt;</span><span style="color: #ff0000">T</span><span style="color: #800000">&gt;</span>(IEnumerable<span style="color: #800000">&lt;</span>T<span style="color: #800000">&gt;</span> source, Func<span style="color: #800000">&lt;</span>T, <span style="color: #00ccff">bool</span><span style="color: #800000">&gt;</span> filter)
{
    <span style="color: #00ccff">if</span> (source<span style="color: #800000"> ==</span> <span style="color: #00ccff">null</span>)<span style="color: #00ccff"> throw new</span> ArgumentNullException(<span style="color: #ff0000">nameof</span>(source));
    <span style="color: #00ccff">if</span> (filter <span style="color: #800000">==</span><span style="color: #00ccff"> null</span>) <span style="color: #00ccff">throw new</span> ArgumentNullException(<span style="color: #ff0000">nameof</span>(filter));

    <span style="color: #00ccff">return</span> <span style="color: #ff0000">Iterator</span>();

    IEnumerable<span style="color: #800000">&lt;</span>T<span style="color: #800000">&gt;</span> <span style="color: #ff0000">Iterator</span>()
    {
        <span style="color: #00ccff">foreach</span> (<span style="color: #00ccff">var</span> element <span style="color: #00ccff">in</span> source) 
        {
            <span style="color: #00ccff">if</span> (<span style="color: #ff0000">filter</span>(element)) { <span style="color: #00ccff">yield return</span> element; }
        }
    }
}
</code></pre>
同樣的例子，不用 <em>local function</em> 的話，就必須把該 method 定義在 Filter 後面，將 <em>iterator</em> 宣告為 <em>private method</em>。這樣會導致封裝性被破壞: 其他成員可能意外的使用它 (而且參數檢查會被略過)。同時，所有原本 <em>local function</em> 需要取用的區域變數與參數，都必須做一樣的處理 (變成 private members)<a id="H"></a>。
<h2 id="-literal">改良的 Literal</h2>
C# 7.0 允許在 <em>number literal</em> (數字常數) 中，用 <code>_</code> 當作 <strong>digit separator</strong> (數字分隔器):
<pre><code class="lang-csharp"><span style="color: #00ccff">var</span> d <span style="color: #800000">=</span> 123_456;
<span style="color: #00ccff">var</span> x <span style="color: #800000">=</span> 0xAB_CD_EF;
</code></pre>
你可以將 <code>_</code> 放在數字中的任何位置，來提高程式碼的可讀性，完全不會對數值本身有任何影響。

此外，C# 7.0 也引入二進位的常數表示方式，你現在可以直接用二進位的方式來取代過去十六進位 (例: <code>0x001234</code>) 的表示方式。例如<a id="I"></a>:
<pre><code class="lang-csharp"><span style="color: #00ccff">var</span> b <span style="color: #800000">=</span> 0b1010_1011_1100_1101_1110_1111;
</code></pre>
<h2 id="ref-returns-ref-locals">Ref returns 與 ref locals</h2>
如同你可以在 C# 用參考的方式傳遞參數 (使用 <code>ref</code> 修飾詞)，你現在也可以用同樣的方式將區域變數的數值用參考的方式傳回。
<pre><code class="lang-csharp"><span style="color: #00ccff">public ref int</span> <span style="color: #ff0000">Find</span>(<span style="color: #00ccff">int</span> number, <span style="color: #00ccff">int</span>[] numbers)
{
  <span style="color: #00ccff">  for</span> (<span style="color: #00ccff">int</span> i = <span style="color: #800080">0</span>; i <span style="color: #800000">&lt;</span> numbers.Length; i<span style="color: #800000">++</span>)
    {
       <span style="color: #00ccff"> if</span> (numbers[i] <span style="color: #800000">==</span> number) 
        {
            <span style="color: #00ccff">return ref</span> numbers[i]; // return the storage location, not the value
        }
    }
   <span style="color: #00ccff"> throw new</span> IndexOutOfRangeException($<span style="color: #99cc00">"{nameof(number)} not found"</span>);
}

<span style="color: #00ccff">int</span>[] array<span style="color: #800000"> =</span> { <span style="color: #800080">1</span>, <span style="color: #800080">15</span>, <span style="color: #800080">-39</span>,<span style="color: #800080"> 0</span>, <span style="color: #800080">7</span>, <span style="color: #800080">14</span>, <span style="color: #800080">-12</span> };
<span style="color: #00ccff">ref int</span> place <span style="color: #800000">=</span> <span style="color: #00ccff">ref</span> <span style="color: #ff0000">Find</span>(<span style="color: #800080">7</span>, array); // aliases 7's place in the array
place <span style="color: #800000">=</span> 9; // replaces 7 with 9 in the array
<span style="color: #ff0000">WriteLine</span>(array[<span style="color: #800080">4</span>]); // prints 9
</code></pre>
這在回傳大型資料結構時相當有用。舉例來說，遊戲程式可能會預先配置龐大的陣列來存放結構資料 (這樣是為了避免執行過程中發生 <em>garbage collect</em>,
導致遊戲暫停)。現在 method 可以直接用參考的方式傳回結構的資料，呼叫端可以直接讀取與修改它的內容。

同時，有些搭配限制來確保這樣做是安全的<a id="J"></a>:
<ul>
 	<li>你只能傳回 "能夠安全傳回" 的參考: 一個是外界傳遞給你的參考，另一個是指向目前物件的 <em>fields</em> (欄位) 的參考。</li>
 	<li><em>ref locals</em> 在初始化時會被指向某個儲存位置，一旦指派之後無法再更改。</li>
</ul>
<h2 id="-">非同步的傳回型別</h2>
到目前為止，C# 的非同步 <em>method</em> 限定必須傳回 <code>void</code>, <code>Task</code> 或是 <code>Task&lt;T&gt;</code> 這幾種型別。C# 7.0 開始，也允許你用同樣的方式，從非同步方法傳回你定義的其他型別。

舉例來說，我們現在可以定義 <code>ValueTask&lt;T&gt;</code> 這個 <em>struct</em> 型別當作傳回值。
這可以避免當非同步執行的結果已經可用，但是卻因為要進行 <code>Task&lt;T&gt;</code> 的配置，而導致非同步執行的結果還在等待中 (<em>awaiting</em> 狀態)。許多涉及 <em>buffering</em>(緩衝) 的非同步操作時，這做法可以明顯地降低配置的次數，同時能帶來明顯的效能提升。
<blockquote>譯註: 例如非同步 I/O 的操作，我們會用非同步的方式將檔案的內容讀到 buffer 內，完成後再不斷重複同樣動作，直到檔案讀取完畢為止，這個動作也許會被重複上千萬次。此時由 <code>Task&lt;T&gt;</code> 替換為 <code>ValueTask&lt;T&gt;</code> 可能可以帶來明顯的效能提升。</blockquote>
也有很多其他的情況下，你可以想像自訂 "task-like" 的應用類型會很有用。要正確地建立它們並不是那麼的直觀，所以我們也不期待大部分的人能正確的使用它們。但是它們可能開始會出現在其他的框架或是 API，而呼叫者可以像過去使用 <code>Task</code> 一樣的使用他，傳回值與 <code>await</code> 等待結果<a id="K"></a>。
<h2 id="-expression-bodies-">更廣泛的 expression bodies 成員</h2>
在 C# 6.0 以前，<em>expression bodied methods</em>, <em>properties</em>(屬性) 等功能大受歡迎，但不是所有的成員都可以
使用。在 C# 7.0 中，<em>accessors</em> (存取子), <em>constructor</em> (建構式) 與 <em>finalizers</em> (終結器) 都已加到可以使用 <em>expression bodies</em> 的清單中<a id="L"></a>:
<pre><code class="lang-csharp"><span style="color: #00ccff">class</span> Person
{
    <span style="color: #00ccff">private static</span> ConcurrentDictionary<span style="color: #800000">&lt;</span><span style="color: #00ccff">int</span>, <span style="color: #00ccff">string</span><span style="color: #800000">&gt;</span> names<span style="color: #800000"> =</span> <span style="color: #00ccff">new</span> ConcurrentDictionary<span style="color: #800000">&lt;</span><span style="color: #00ccff">int</span>, <span style="color: #00ccff">string</span><span style="color: #800000">&gt;</span>();
    <span style="color: #00ccff">private int</span> id<span style="color: #800000"> =</span> <span style="color: #ff0000">GetId</span>();

    <span style="color: #00ccff">public</span> <span style="color: #ff0000">Person</span>(<span style="color: #00ccff">string</span> name) <span style="color: #800000">=&gt;</span> names.<span style="color: #ff0000">TryAdd</span>(id, name); // constructors
   <span style="color: #ff0000"> ~Person</span>() <span style="color: #800000">=&gt;</span> names.<span style="color: #ff0000">TryRemove</span>(id, <span style="color: #00ccff">out</span> <span style="color: #800000">*</span>);              // destructors
  <span style="color: #00ccff">  public string</span> Name
    {
       <span style="color: #00ccff"> get</span> <span style="color: #800000">=&gt;</span> names[id];                                 // getters
        <span style="color: #00ccff">set</span> <span style="color: #800000">=&gt;</span> names[id]<span style="color: #800000"> =</span> <span style="color: #00ccff">value</span>;                         // setters
    }
}
</code></pre>
這個新語法的範例程式並非來自 Microsoft C# 編譯器的團隊，而是由社群成員貢獻的。太棒了! Open source!
<h2 id="throw-">Throw 運算式</h2>
要在運算式之中丟出一個例外 (exception) 是很容易的，只要呼叫 <em>method</em> (在 <em>method</em> 內擲出 exception) 就可以了。但是在 C# 7.0 我們允許在運算式之中直接就地丟出 exception:
<pre><code class="lang-csharp"><span style="color: #00ccff">class</span> Person
{
    <span style="color: #00ccff">public string</span> Name { <span style="color: #00ccff">get</span>; }
    <span style="color: #00ccff">public</span> <span style="color: #ff0000">Person</span>(<span style="color: #00ccff">string</span> name)<span style="color: #800000"> =&gt;</span> Name<span style="color: #800000"> =</span> name <span style="color: #800000">??</span> <span style="color: #00ccff">throw new</span> ArgumentNullException(nameof(name));
    <span style="color: #00ccff">public string</span> <span style="color: #ff0000">GetFirstName</span>()
    {
        <span style="color: #00ccff">var</span> parts <span style="color: #800000">=</span> Name.<span style="color: #ff0000">Split</span>(<span style="color: #99cc00">" "</span>);
        <span style="color: #00ccff">return</span> (parts.Length <span style="color: #800000">&gt;</span> 0) <span style="color: #800000">?</span> parts[0] : <span style="color: #00ccff">throw new</span> InvalidOperationException(<span style="color: #99cc00">"No name!"</span>);
    }
   <span style="color: #00ccff"> public string</span> <span style="color: #ff0000">GetLastName</span>() <span style="color: #800000">=&gt;</span> <span style="color: #00ccff">throw new</span> NotImplementedException();
}

</code></pre>

<hr />

🌟 更多最新文章及資訊 &gt;&gt;<span style="color: #ff0000"> <a href="https://www.facebook.com/msdn.taiwan/">MSDN 台灣粉絲專頁</a> </span>&amp; <a href="https://blogs.msdn.microsoft.com/msdntaiwan/">MSDN 台灣部落格</a>

🌟 <span>更多熱門課程影片 &gt;&gt; <span style="color: #ff0000"><a href="https://channel9.msdn.com/">Channel 9 免費課程平台</a></span></span>]]></content:encoded>
    </item>
    <item>
      <title>Windows Communication Foundation 情境大解密！</title>
      <link>https://docs.microsoft.com/archive/blogs/msdntaiwan/windows-communication-foundation</link>
      <pubDate>Wed, 22 Mar 2017 14:14:34 GMT</pubDate>
      <dc:creator><![CDATA[MSDN Taiwan]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/msdntaiwan/?p=13985</guid>
      <description><![CDATA[論壇精選更版囉！將帶來一則熱門疑問，與您分享、共同探討其中的解決方式，感謝 MSDN...]]></description>
      <content:encoded><![CDATA[<span>　<a href="https://social.msdn.microsoft.com/Forums/zh-TW/home"><img src="https://msdnshared.blob.core.windows.net/media/2017/02/0223-01-800x319.jpg" alt="0223-01" width="1031" height="411" class="aligncenter wp-image-13995" /></a></span>

<span>        論壇精選</span>更版囉！將帶來一則熱門疑問，與您分享、共同探討其中的解決方式<span>，感謝 MSDN 小幫手</span>整理相關的文章說明及影片精華，以解決你的煩惱絲，幫助大家更容易解決問題及蒐集資訊。

👉如有問題，都歡迎至 <a href="https://social.msdn.microsoft.com/Forums/zh-TW/home">MSDN 論壇</a>提問，將會不定期的整理熱門疑問，並提供相關的免費資源喔！

<strong>👉</strong>欲追蹤最新文章及熱門影片，<a href="https://www.facebook.com/msdn.taiwan/">MSDN台灣</a> 不可錯過～

<!--more-->

&nbsp;
<h3><a href="https://msdnshared.blob.core.windows.net/media/2016/07/Microsoft-logo-e1468823486155.png"><img class="wp-image-8635 alignnone" src="https://msdnshared.blob.core.windows.net/media/2016/07/Microsoft-logo-e1468823486155-25x25.png" alt="Microsoft-logo" width="34" height="34" /></a> <a href="https://social.msdn.microsoft.com/Forums/zh-TW/9bad2c91-d0bd-4f28-8d45-d0c20bcdd104/-wcf-?forum=236">Windows Communication Foundation 都用在甚麼情境呢？</a></h3>
<a href="https://social.msdn.microsoft.com/Forums/zh-TW/398edf2c-4052-4501-8708-984c76ed1b04/processstart?forum=236"></a><span>　　</span>想請教大家實際的經驗中，不知 Windows Communication Foundation 是否有較具體的應用實例 ?

&nbsp;
<h3>能怎麼做呢？</h3>
<ul>
 	<li class="title">
<h4><a href="https://msdn.microsoft.com/en-us/library/ms731082(v=vs.110).aspx">什麼是 Windows Communication Foundation 呢？</a></h4>
基礎工要扎實，還不清楚 Windows Communication Foundation，就一定要鎖定本篇文章。</li>
 	<li class="title">
<h4><a href="https://blogs.msdn.microsoft.com/drnick/2007/07/06/wcf-case-studies/">Windows Communication Foundation 案例研究</a></h4>
<a href="https://msdn.microsoft.com/zh-tw/library/58wxa9w5(v=vs.120).aspx#bkmk_usingiisexpress"></a>內含數十種具體案例分享，協助您解決問題的好資源。</li>
</ul>
<ul>
 	<li style="text-align: left">
<h4><a href="https://blog.darkthread.net/post-2015-08-22-remoting-wcf-webapi-choice.aspx">.NET Remoting、WCF、WebAPI、Socket，該怎麼選？</a></h4>
<a href="https://support.microsoft.com/zh-tw/kb/555134"></a><span>使用 .NET Remoting 的舊程式，需與伺服器建立連線進行高頻率雙向傳輸，計劃翻寫新版本。.NET Remoting 是 .NET 2.0 時代的技術，十年後多了不少選擇：WCF、Web API、SingalR … 選擇變多煩惱跟著來，該怎麼選擇才對？</span></li>
</ul>
<h4><a href="https://msdnshared.blob.core.windows.net/media/2016/10/0383.channel-9-logo.png"><img width="51" height="60" class="wp-image-9505 alignnone" alt="0383.channel-9-logo" src="https://msdnshared.blob.core.windows.net/media/2016/10/0383.channel-9-logo.png" /></a><a href="https://www.youtube.com/watch?v=QeJlC1cpf9s">Serious Web Services: Windows Communication Foundation (WCF), Web API, OData, and More</a></h4>
<p style="text-align: center"><iframe width="700" height="450" src="https://www.youtube.com/embed/QeJlC1cpf9s" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>


<hr />

欲觀看更多精彩課程請至 &gt;&gt; <span style="color: #ff0000"><span style="color: #993300"><a href="https://channel9.msdn.com/">Channel 9 免費課程平台</a> </span></span>及<span style="color: #000000"> </span><span style="color: #993300"><a href="https://blogs.msdn.microsoft.com/msdntaiwan" class="for-desktop">MSDN 台灣部落格</a></span>

🔥也歡迎加入<span style="color: #000080"> <span style="color: #993300"><a href="https://www.facebook.com/msdn.taiwan/">MSDN 台灣</a></span> </span>粉絲專頁，鎖定每日最新的好文分享及精選課程喔！]]></content:encoded>
    </item>
    <item>
      <title>【案例分享】威煦軟體採用 Visual Studio 及 Azure 以電子化推動台灣產業的環安衛管理升級</title>
      <link>https://docs.microsoft.com/archive/blogs/msdntaiwan/wishing-soft</link>
      <pubDate>Mon, 20 Mar 2017 15:45:41 GMT</pubDate>
      <dc:creator><![CDATA[MSDN Taiwan]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/msdntaiwan/?p=14015</guid>
      <description><![CDATA[採用 Microsoft Azure 及 Visual Studio 打造環安雲，以專業及速度優勢快速因應法令及市場需求

圖: 威煦軟體團隊 (不包括遠端工作的工程團隊)
　　以「B...]]></description>
      <content:encoded><![CDATA[<h3 style="text-align: center">採用 Microsoft Azure 及 Visual Studio 打造環安雲，以專業及速度優勢快速因應法令及市場需求</h3>
<img src="https://msdnshared.blob.core.windows.net/media/2017/03/8.18.35-800x525.png" alt="8-18-35" width="512" height="336" class="aligncenter wp-image-14075" />
<p style="text-align: center">圖: 威煦軟體團隊 (不包括遠端工作的工程團隊)</p>
<span>　　</span>以「B 型企業」（Benefit Corporation）為目標，在兼顧經營獲利與社會公益的前提下，威煦軟體投入環安衛管理軟體的開發，並在這塊新藍海獲得來自國內外知名企業的肯定。

<span>　　</span>威煦以 Microsoft Azure 及 Visual Studio 開發的環安雲，是以 PDCA 循環為基礎的環安衛整合性管理平台，目前已有法規雲、化學雲、定檢雲三大功能模組，不但能快速因應持續變動的環安衛法令及大量的客戶需求，還兼具了導入成本低、上線快的優勢，協助台灣產業落實及強化環安衛管理。
<!--more-->

<span>　　</span>威煦軟體執行長董軒宇表示：「我們的業務模式是 B2B，必須選擇企業主流的解決方案，才能順利與企業環境接軌並獲得信任。拜訪過幾百家公司實地了解他們的 IT 環境，以及客戶對環安雲的高接受度，讓我覺得創業之初就選擇 Microsoft Azure 和 Visual Studio 真的是押對寶。」

&nbsp;
<h3><span style="color: #000080"><strong>以專業為先，改革環安衛管理</strong></span></h3>
<span>　　</span>從違法排放廢水、高雄氣爆到遊覽車翻覆意外，甚至是熱度未退的食安問題，其實全都是環安衛相關課題，這些事件不僅讓企業及個人蒙受損失，更是付出了巨大的社會成本。

<span>　　</span>但長久以來，台灣在環安衛管理多是以紙本手寫搭配 Excel 的傳統作法，隨著多起重大事件讓政府頻繁修法且更趨嚴格，確保遵循法規也變得更為複雜且挑戰，運用軟體來協助管理、簡化作業是唯一的解答。

<span>　　</span>然而，許多企業雖然有內部開發團隊，卻沒有環安衛管理的應用系統，因為環安衛領域高度專業，技術門檻極高，一般的 IT 團隊難以瞭解及掌握；此外，法令雖有規範環安衛人員的配置，但企業多採最低標準員額來僱用，造成環安衛人員極為忙碌，沒有餘裕協助系統的開發。

<span>　　</span>這些挑戰成為威煦進軍市場的利基。董軒宇指出，環安雲的獨特優勢就是集結眾人的經驗和專業，而不只是單一公司閉門造車的專業，威煦的客戶群橫跨各種產業，功能開發幾乎都以客戶需求為先，長期下來已經形成可以直接遵循及採用的標準作業流程；同時，威煦擁有專業的安環與軟體開發團隊，更和顧問公司、驗證及訓練機構都有密切的合作關係，精益求精的速度也優於一般企業。

<img src="https://msdnshared.blob.core.windows.net/media/2017/03/8.18.26-783x600.png" alt="8-18-26" width="425" height="326" class="aligncenter wp-image-14066" />
<p style="text-align: center">圖: 左起為 營運長 <span>麥桓瑄、執行長 董軒宇</span></p>

<h3><span style="color: #000080"><strong>選用主流方案，接軌企業環境</strong></span></h3>
<span>　　</span>威煦的環安雲以雲端服務的形式運作，針對大型客戶亦可快速落地。創業之初對開發工具和公有雲平台的選擇，可說是威煦成功打進市場的關鍵之一。董軒宇說：「當初我選擇 C# 做為程式語言，並以市場資源如書籍、社群、中文化文件最多的開發工具為優先，而選中 Microsoft Visual Studio；此外，以企業級 Web 應用程式開發而言，ASP.NET 的開放性也優於其他競爭對手。」值得一提的是，身為 Microsoft BizSpark 計畫的成員，除了大量的課程資源，威煦也從群組的交流互動獲得許多助力。

<span>　　</span>威煦決定放棄自建機房，改以公有雲平台運行環安雲時，也順理成章選擇了 Microsoft Azure。在董軒宇拜訪的幾百間企業裡，幾乎都有 Windows Server 主機搭配 SQL Server 資料庫的 IT 環境，而且 Azure 的市場認同度很高，就連許多資安控管極其嚴格的大型企業也願意使用，讓威煦幾乎不必花費心力與客戶溝通雲端的安全問題，Microsoft Azure 提供的固定 IP、資料庫加密、自動備份等內建服務，也讓客戶使用時更為安心。

<span>　　</span>環安環管理軟體不僅要有專業知識為基礎，還要即時因應法令變化及客戶需求，威煦目前是以一週一版的步調做更新，版本控制和部署方式就顯得更為重要，Microsoft Azure 和 Visual Studio 所提供的完整支援讓威煦事半功倍，舉例來說，利用 Microsoft Azure 就能快速建置測試環境、彈性擴充效能。

<span>　　</span>威煦軟體營運長麥桓瑄指出，臺灣企業常用化學品多達上萬筆，但因化學品種類繁多加上列管法規與計算方式複雜，許多企業對於管理方式與數量掌握都十分苦惱，這也是很多環安事故的根源。且被檢查機構檢查到缺失時，又得快速改善，否則就是連續開罰。此時，威煦成熟的產品加上一周內完成導入的速度優勢，就是協助客戶符合法規的重要關鍵。

&nbsp;
<h3><span style="color: #000080"><strong>擴展行動化支援和分析預測能力</strong></span></h3>
<span>　　</span>透過系統的線上對談功能，客戶可以隨時反饋意見及需求，敏捷式開發和微軟開發工具的結合，是快速回應客戶需求解決問題或推出新功能的關鍵，微軟的軟體改版速度快，讓威煦免於苦等新功能釋出。

<span>　　</span>由於環安衛是走動式管理，威煦計劃今年推出行動 app，為了避免從頭開發或重新學習行動開發等問題，決定採用 Microsoft Xamarin 協助發展行動裝置版本。此外，Microsoft Azure 的機器學習、Power BI 等先進技術，也將協助環安雲強化分析及預測功能，例如：可量化的環安衛指數及智能分析等。

<span>　　</span>透過環安雲，威煦協助台灣產業建立可以累積廠內安全知識的資料庫，即時對應法令修改與相關資訊，完整保存安環管理記錄。連帶地，這也解決了安環人才過於搶手而造成的高流動率問題，有了環安雲做為銜接，就能免除人員交接的落差和困難。

<img src="https://msdnshared.blob.core.windows.net/media/2017/03/FullSizeRender-3-800x547.jpg" alt="fullsizerender-3" width="456" height="312" class="aligncenter wp-image-14025" />

<span>　　</span>董軒宇表示：「Microsoft Azure 是超值、安全且高度整合的公有雲服務，Visual Studio 則提供完整的開發環境，在微軟團隊的協助下，讓我們能聚焦在專業，協助客戶解決環安衛管理難題，並持續降低風險、提升成效，與大家共同打造一個更美好、更安全的未來。」]]></content:encoded>
    </item>
    <item>
      <title>【案例分享】FarmVet Systems 使用 SQL Server 與 Visual Studio 開發行動數據應用，提升農場獸醫生產力！</title>
      <link>https://docs.microsoft.com/archive/blogs/msdntaiwan/farmvet-systems-case-study</link>
      <pubDate>Mon, 20 Feb 2017 17:39:36 GMT</pubDate>
      <dc:creator><![CDATA[MSDN Taiwan]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/msdntaiwan/?p=13925</guid>
      <description><![CDATA[「農場獸醫們是行動工作者，他們漸漸地提高對智慧型手機和平板的仰賴，以及為了讓 VetIMPRESS...]]></description>
      <content:encoded><![CDATA[<a href="https://www.farmvetsystems.com/"><img src="https://msdnshared.blob.core.windows.net/media/2017/02/Untitled-1-01-800x319.jpg" alt="untitled-1-01" width="800" height="319" class="aligncenter size-medium wp-image-13965" /></a>

<strong></strong>
<blockquote>
<p style="text-align: left">「農場獸醫們是行動工作者，他們漸漸地提高對智慧型手機和平板的仰賴，以及為了讓 <span>VetIMPRESS </span>變成他們生活中的一部分（就像他們每天生活中會使用的聽診器和威靈頓靴子），這個解決方法必須能在手中的行動裝置執行。」</p>
<p style="text-align: right">－ George Brownlee : 創辦人暨執行長</p>
</blockquote>
<p style="text-align: right"><!--more--></p>
<strong></strong>

<hr />

<span>　　</span>隨著農場的規模越來越大以及養的牲畜越來越多，農夫們必須花費更多心力在提升農場整體的生產力。他們需要知道如何透過微小的改變帶給農場更大的進步。例如，相較於請獸醫執行一些像是懷孕掃描或是蹄修剪等基本任務，現今的農夫們轉而向獸醫諮詢動物的健康和福利以幫助他們提升農場的效率和生產力。因此，獸醫們不得不改變商業模式。與其僅僅依賴他們的雙手，不如更加運用他們的專業知識。

<span>　　</span>為了因應這項改變，獸醫們需要數據。他們需要在造訪農場之前，瞭解農場的表現以及動物們的健康狀況與生產力。他們也需要知道：隨著時間的推移，農場的表現如何變化，以及它與更廣泛之行業的關連。然而眾所皆知，農場的數據是非常零碎的，散落各處及未連接的銷售點系統、牛奶加工目錄、診斷實驗室和整個行業的政府監管數據庫。就連個別的獸醫實驗中的數據也往往非常零散。

<span>　　</span>而以上就是這位年輕獸醫 <span>George Brownlee</span>，在愛爾蘭的 <span>Belfast </span>服務牲畜農場和乳酪農場並開始他的實驗時所經歷的狀況。

<span>　　</span>「為了提供我想要的服務水平給我現代農場的客戶，我在要去農場的前一天晚上熬夜到凌晨兩點鐘，必須去尋找各種網站以求得正確合適的資訊。或甚至在前一天到農場去收集電腦上的文件或是從書中獲得一些數據。我必須在 <span>Excel </span>中做大量的數據分析，把它們印出來，然後隔天再帶著這些文件跟著我到農場去。」

<span>　　</span>Brownlee 想要創造一個方式收集行業數據，整合農場資料，並且可以帶著它到處巡視。他想要替他所照料的動物們創造電子醫療病例，以及幫每個農場創造履歷簡介。

<span>　　</span>所以在 <span>2010 </span>年時，他與北愛爾蘭的另一名獸醫合作成立 <span>FarmVet Systems</span>，一個獨立的軟體販賣商。並且創造了 <span>VetIMPRESS</span>，一種安全、以網路為基礎的軟體即服務解決方案，幫助獸醫們收集、標準化，以及分析和它們實驗中動物的健康以及福利有關的數據。

&nbsp;
<h3 style="text-align: justify"><span style="color: #333399"><strong>進入更進階的領域</strong></span></h3>
<span>　　</span>為了提供照料大型動物的獸醫和其他在不同農場間游移的服務供應者真正有效的解決方案，<span>FarmVet Systems </span>的創立者知道他們需要一個可以在任何地方、任何裝置上存取進入的方法。「農場獸醫們是行動工作者」<span>FarmVet Systems </span>的創立者兼 <span>CEO George Brownlee </span>說到。「他們漸漸地提高對智慧型手機和平板的仰賴，以及為了讓 <span>VetIMPRESS </span>變成他們生活中的一部分（就像他們每天生活中會使用的聽診器和威靈頓靴子），這個解決方法必須能在手中的行動裝置執行。」

<span>　　</span>透過創造一種行動數據的解決方案，<span>VetIMPRESS </span>讓獸醫在現有數據上收集到最多數據變得更簡單，並創造一種獨特的數據集讓他們可以在與客戶諮詢業務時使用。<span>FarmVet </span>希望獸醫們和其他農場服務提供者能夠輕鬆的擷取數據，以便立即進行現場分析並告知他們診斷測試的決定。幫助他們辨識有可能影響農場生產力和效率的潛在問題，以及增加農場顧客端的可見性。

<span>　　</span>為了替 <span>VetIMPRESS </span>軟體建造一個行動<span> App</span>，一個在 <span>FarmVet Systems </span>的小開發團隊（包括四位在數據端和三位在應用程序端）使用微軟<span> Visual Studio </span>和 <span>Visual Studio Tools for Apache Cordova</span>。這樣一來，團隊就可以使用單一程式庫以定位給 <span>Android</span>、<span>iOS </span>和 <span>Windows </span>等多種平台。

<span>　　</span>「我們需要某種可以盡可能的交互越多平台的方法」<span>Brownlee </span>說。「但是我們只有一個小團隊。我們需要可以適應內部技能的開發工作，因為這將會是我們產品提供的重要核心的一部分。只是我們已經沒有辦法僱用更多擁有其他技能的人才。使用 <span>Visual Studio </span>意味著我們在建造這三個平台時可以省下百分之四十或更多的成本。」

&nbsp;
<h3><span style="color: #333399"><strong>給小團隊的大工作</strong></span></h3>
<span>　　</span>使用 <span>Visual Studio</span>，開發團隊不只可以減少成本，也可以減少上市所需時間。還可以避免特定平台的編碼，代表開發團隊可以避免一些如果嘗試替不同類型的設備將相同的功能帶到市場時會造成的問題（包括除錯和顧客支援等問題）。

<span>　　</span>因為開發工作被簡化了，團隊持續在改進顧客的使用者體驗。獸醫可以進入他們的日誌，在給定日期的時間表上更新農場動物的紀錄，以及存取農場的歷史造訪紀錄。不論何時，只要裝置位於 <span>Wi-Fi </span>提供的範圍內，<span>App </span>會自動捕捉從 <span>Microsoft SQL Server 2012 R2 </span>伺服器傳來的新資訊並且推送更新給獸醫。除了可以擷取動物數據，這個 <span>App </span>還可以傳送獸醫的實驗室工作並且將報告傳給顧客。並且，當數據流入，他會監視目標和門檻，在準備好被查看的特定數據傳入時會提醒獸醫。

<span>　　</span>「我們能夠透過 <span>Visual Studio </span>所建置出來的成品是非常廣泛的」<span>Brownlee </span>說。「獸醫們需要足夠的數據以支撐一整天的工作，像是有幾千隻動物需要照料等等，以及當他們外出、寫報告和儲存影像時也要產生更多的數據。Visual Studio 在 App 如何到處傳輸數據這方面，讓整件事變得真的非常有效率。」

<span>　　</span>VetIMPRESS 的顧客數量，一直不斷的在成長。現在還包括藥劑師、食品公司以及會使用到農場數據的其他組織。現在，他們已經可以存取過往不可用或未紀錄的農場和動物數據，以創造全面的動物健康和生產力願景，提供他們的顧客更好的服務。

（本文出自：<a href="https://customers.microsoft.com/en-US/story/increasing-farm-productivity-with-mobile-tools">Increasing farm productivity with mobile tools</a>）]]></content:encoded>
    </item>
  </channel>
</rss>