我想要扩展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 –