我想要擴展System.String
並添加一個靜態字段String.Space
,它代表單個空間" "
,就像Microsoft在名稱空間Using System;
中實現String.Empty
一樣。我無法實現這個擴展請幫助。如何擴展String.Space類似於C#中的String.Empty?
我想實現一種場擴展...
想要的結果類似
我想要擴展System.String
並添加一個靜態字段String.Space
,它代表單個空間" "
,就像Microsoft在名稱空間Using System;
中實現String.Empty
一樣。我無法實現這個擴展請幫助。如何擴展String.Space類似於C#中的String.Empty?
我想實現一種場擴展...
想要的結果類似
不幸的是,框架(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();
這屬於那些「它不漂亮,但它的作品」類別之一。
簡單的'var space ='''?怎麼辦?或另一個簡單的'var space = MyConstants.Space;'(將Space作爲MyConstants類的公共只讀屬性)?擴展方法只是語法糖,可以幫助您編寫更多「漂亮」的代碼。用他們寫「不漂亮」的代碼沒有意義恕我直言。 –
@GanPaolo我完全同意。我個人不會在這方面使用擴展名。OP想要一個屬性擴展,我只是提供了一個仍然適合擴展語法的替代方案。 DiskJunky通過提供替代非擴展建議來更正它。 –
你可以像這樣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 Pechos的link從C#語言開發團隊報價。
這當然是顯而易見的天然伴侶擴展方法是擴展屬性這是不太明顯的,由於某種原因,擴展事件,擴展操作符,擴展構造函數(也稱爲「工廠模式」)等等也都是自然夥伴,但我們甚至沒有考慮設計C#3的擴展屬性;我們知道它們不是必要的,並會增加風險已經冒險的時間表沒有引人注目的收益。
基本上歸結爲「There wasn對於擴展屬性的'迫切需要'來允許你創建類似string.Space
的東西。也許在未來的版本中。
是的,我同意,但微軟實施String.Empty,即使我們可以解決使用「」字符。我只是提供了一個簡單的例子,因爲@logix想要發佈它。 –
@RahulUttarkar他們做了,但空間將比'「」更罕見。正如@LindosPechos所說,有沒有擴展屬性的原因 - 這是你在OP中做的。 – DiskJunky
@RahulUttarkar它是過去幾天的遺蹟。 [這](https://stackoverflow.com/questions/151472/what-is-the-difference-between-string-empty-and-empty-string)可能會爲你顯示。 –
我能夠做到以下幾點。你會得到一個警告,但它編譯。
namespace System
{
public static partial class String
{
public static string Space = " ";
}
}
要撥打:
string sp = String.Space;
你應該使它成爲'const'或者至少'只讀' – DiskJunky
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;
}
}
}
你只需要擴展方法不是課堂上的屬性或領域。唯一的方法就是像這種類型設置別名擴展字段。一些保留字不像小字母開始字符串那樣工作,因爲它已經是System.String的別名 – umasankar
到目前爲止您嘗試過什麼? 「不能實現」是什麼意思?請詳細說明 – logix
我也是*爲什麼*你想要這樣做? – DiskJunky
檢查答案在這裏:https://stackoverflow.com/questions/249222/can-i-add-extension-methods-to-an-existing-static-class –