2017-10-05 21 views
-2

我想要擴展System.String並添加一個靜態字段String.Space,它代表單個空間" ",就像Microsoft在名稱空間Using System;中實現String.Empty一樣。我無法實現這個擴展請幫助。如何擴展String.Space類似於C#中的String.Empty?


我想實現一種場擴展...

enter image description here

想要的結果類似

enter image description here

+2

到目前爲止您嘗試過什麼? 「不能實現」是什麼意思?請詳細說明 – logix

+2

我也是*爲什麼*你想要這樣做? – DiskJunky

+1

檢查答案在這裏:https://stackoverflow.com/questions/249222/can-i-add-extension-methods-to-an-existing-static-class –

回答

4

不幸的是,框架(V4.7在本文寫作時間)目前不支持擴展屬性/字段。請看這裏的好書寫"Why No Extension Properties?"

這意味着您僅限於使用擴展方法。 一個這樣的例子:

namespace System.String 
{ 
    public static class Extensions 
    { 
     public static string Space(this string s) 
     { 
      return " "; 
     } 
    } 
} 

擴展方法需要一個對象的實例。因此,它可以被用作這樣的:

// Returns " " 
var space = "".Space(); 

或者

// Returns " " 
var space = String.Empty.Space(); 

這屬於那些「它不漂亮,但它的作品」類別之一。

+3

簡單的'var space ='''?怎麼辦?或另一個簡單的'var space = MyConstants.Space;'(將Space作爲MyConstants類的公共只讀屬性)?擴展方法只是語法糖,可以幫助您編寫更多「漂亮」的代碼。用他們寫「不漂亮」的代碼沒有意義恕我直言。 –

+0

@GanPaolo我完全同意。我個人不會在這方面使用擴展名。OP想要一個屬性擴展,我只是提供了一個仍然適合擴展語法的替代方案。 DiskJunky通過提供替代非擴展建議來更正它。 –

12

你可以像這樣static class;

public static class Strings 
{ 
    public const string Space = " "; 
} 

並在你的代碼中使用它;

FullName = FirstName + Strings.Space + MiddleName + Strings.Space + LastName; 

但是,最終目標是使代碼可維護,合理高效並減少出錯的可能性。考慮到這一點,最好減少連接的數量並提供所需的值。爲此,一個簡單的格式字符串將是一個更清潔的方法; (在C#6之前);

FullName = string.Format("{0} {1} {2}", FirstName, MiddleName, LastName); 

而且如果C#6 +

FullName = $"{FirstName} {MiddleName} {LastName}"; 

爲什麼你會使用那些最後兩種方法?那麼,這歸結於問題的分離。將字符串格式設置爲string.Format(),並提供所需的值。通過減少混合中的組件數量,減少錯誤發生的可能性,減少維護開銷,並通過減少執行並置所涉及的字符串數量來提高效率。

編輯

至於「爲什麼不支持C#擴展屬性?」我想提取Lindos Pechoslink從C#語言開發團隊報價。

這當然是顯而易見的天然伴侶擴展方法是擴展屬性這是不太明顯的,由於某種原因,擴展事件,擴展操作符,擴展構造函數(也稱爲「工廠模式」)等等也都是自然夥伴,但我們甚至沒有考慮設計C#3的擴展屬性;我們知道它們不是必要的,並會增加風險已經冒險的時間表沒有引人注目的收益。

基本上歸結爲「There wasn對於擴展屬性的'迫切需要'來允許你創建類似string.Space的東西。也許在未來的版本中。

+0

是的,我同意,但微軟實施String.Empty,即使我們可以解決使用「」字符。我只是提供了一個簡單的例子,因爲@logix想要發佈它。 –

+0

@RahulUttarkar他們做了,但空間將比'「」更罕見。正如@LindosPechos所說,有沒有擴展屬性的原因 - 這是你在OP中做的。 – DiskJunky

+1

@RahulUttarkar它是過去幾天的遺蹟。 [這](https://stackoverflow.com/questions/151472/what-is-the-difference-between-string-empty-and-empty-string)可能會爲你顯示。 –

0

我能夠做到以下幾點。你會得到一個警告,但它編譯。

namespace System 
{ 
    public static partial class String 
    { 
     public static string Space = " "; 
    } 
} 

要撥打:

string sp = String.Space; 
+2

你應該使它成爲'const'或者至少'只讀' – DiskJunky

1
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace StringFunctions.Extensions 
{ 
    public static class StringExtensions 
    { 
     public static readonly string Space = " "; 

     public static string Spacemethod(this string name) 
     { 
      return string.Concat(name," "); 
     } 
    } 
} 

的地方使用String類的別名。 Like

using String = StringFunctions.Extensions.StringExtensions;

小串它的保留字,所以,它的投Error.if你得到String.Space W =它的工作類的整個地方,其他字符串函數調用,比如string.Empty你的函數調用String.Space這樣

using String = StringFunctions.Extensions.StringExtensions; 
namespace StringFunctions 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var t = String.Space; 

     } 

    } 
} 
+0

你只需要擴展方法不是課堂上的屬性或領域。唯一的方法就是像這種類型設置別名擴展字段。一些保留字不像小字母開始字符串那樣工作,因爲它已經是System.String的別名 – umasankar