只有累積,沒有奇蹟

2019年1月24日 星期四

[.NET] 選擇性參數 (Optional parameters) 的另一種選擇 - OptionalAttribute

前言 
上一篇文章介紹 了具名引數 (named argument) 的用法,其中被呼叫的方法是使用 C# 4.0 的 optionnal argument 達到方法選擇性參數過去待過的公司 method 遇到選擇性參數時大多使用 optionnal argument 方式來解決,但其實有另外一種方式可以使用 optionAttribute,這篇就簡單介紹針對同樣需求兩者的寫法

使用方式
Optional Argument
相信很多人都使用過不再多做介紹,直接看 sample code 中 firstName、lastName 為選擇性參數如果使用端沒有傳參數時就以使用預設值,如下所示
  1. public static class FullName
  2. {
  3. public static string ParameterDefaults(string firstName, string lastName, string middleName = "", string title = "")
  4. {
  5. return (title == "") ? $"Hi, {firstName} {lastName}" : $"Hi,{firstName} {lastName}";
  6. }
  7. }
呼叫端使用上很簡單,可以按照順序傳入參數 (postitional argument) 或是具名引數 (named argument) 的方式達到sample code 如下
  1. // positional arguments
  2. FullName.ParameterDefaults("marcus", "tung");
  3. FullName.ParameterDefaults("marcus", "tung", "middle");
  4. FullName.ParameterDefaults("marcus", "tung", "middle", "mr.");
  5.  
  6. // named arguments
  7. FullName.ParameterDefaults(firstName: "Marcus", lastName: "tung");
  8. FullName.ParameterDefaults(middleName: " test", firstName: "Marcus", lastName: "tung");
  9. FullName.ParameterDefaults(title: "Mr.", firstName: "Marcus", lastName: "tung", middleName: " test");

OptionalAttribute
來到今天主題,可以使用 optionalAttribute,使用前須先 using System.Runtime.InteropServices,在參數前面加上 [option] 即可使用,範例 Code 如下
  1. using System.Runtime.InteropServices;
  2. public static string OptionalAttribute(string firstName, string lastName, [Optional] string middleName,
  3. [Optional] string title)
  4. {
  5. return (title == "") ? $"Hi, {firstName} {lastName}" : $"Hi,{firstName} {lastName}";
  6. }
  7.  
呼叫端使用 sample code 如下
  1. // first + last
  2. FullName.OptionalAttribute("Marcus", "tung");
  3. // title + first + last
  4. FullName.OptionalAttribute("Marcus", "tung", "Mr.");
  5. // first + last + middle
  6. FullName.OptionalAttribute(firstName: "Marcus", lastName: "tung", middleName: " test");
  7. // title + first + last + middle
  8. FullName.OptionalAttribute("Marcus", "tung", "middle", "mr");
murmur 
兩者在用法上都很簡單,但可以想一下當參數值越變越多時會有什麼後遺症,很有可能程式邏輯上會有很多 if ... else 判斷式分支產生,這時候程式碼就會出現壞味道。如果參數太多,可以考慮減少參數數量或是使用一個 model 來傳遞參數值,盡量降低代碼邏輯複雜化

參考
具名和選擇性引數
C# 4.0 Features

Related Posts:

  • [.NET] ASP.NET Application 概述 ASP.NET 處理請求的兩個步驟 當用戶發送一個請求到IIS(這裡指IIS 5.0 & IIS 6.0),ASP.NET 處理請求的步驟有兩種 1. 建立一個可以處理用戶端傳來請求Request的環境(ASP.NET Environment),包括建立application object(應用程式)、Ruquest、Response、Context Object等物件來處理此Ruquest請求。 2. 環境被建立後,應用程式會透過m… Read More
  • [.NET] 如何取得 Enum 的 Description 描述字串前言  列舉類型 Enum 在 C# 很常用的一種類型,所允許的型別必須是byte、sbyte、short、ushort、int、uint、long、ulong,在使用上沒特別指定的話基本類型是 int,對我自己來說在程式中使用 Enum 而不用 int 的好處是 Code 閱讀上比較清晰,舉例來說在閱讀代碼時第一段代碼使用 Enum 更容易讓人好懂些 if (code == ResponseCode.OK) //… Read More
  • [C#] Anonymous Type 匿名型別說明 Anonymous Type 是甚麼? 匿名型別是C# 3.0開始有的特性,是一種暫存型的型別,不需要建立額外的類別來存放資料 根據MSDN對於 匿名型別 的說明如下 根據MSDN的說明,整理一下重點及特性 1. 透過 new 建立實體  // Anonymous Typevar employee = new { Id = 1, Name = "Marcus", Age = 22 } … Read More
  • [.NET] 無法載入檔案或組件 'Newtonsoft.Json' 或其相依性的其中之一 (發生例外狀況於 HRESULT: 0x80131040)問題 接獲同事報案,反應在測試環境出現以下錯誤訊息 無法載入檔案或組件 'Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' 或其相依性的其中之一。 找到的組件資訊清單定義與組件參考不符。 (發生例外狀況於 HRESULT: 0x80131040) ,實際專案底下 bin 資料夾該 dll 是存在的,心想這問題… Read More
  • [AWS] 使用 AWS SDK上傳檔案到 AWS S3前言 最近在與第三方做串接時,有個需求是要將圖片存起來放在 Application Server 上,與同事討論建議將圖片放在AWS S3 上,多年前有微軟剛推出 Azure 時有接觸過一些,但這幾年隨著年紀增長早已忘光光,這篇簡單紀錄 C# 透過 AWS SDK 將圖片上傳到 AWS S3 上的步驟與要注意的細節 AWS S3  Amazon Simple Storage Service 功能簡稱 S3,是Amazon的物件儲存服務,… Read More

0 意見:

張貼留言

Copyright © 2025 m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com