2017-10-05 52 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