C# 如何扩展类似于c中String.Empty的String.Space?
我正在尝试扩展System.String并添加一个静态字段String.Space,它表示一个单独的空间,就像Microsoft使用System;在命名空间中实现String.Empty一样;。我无法实现此扩展,请帮助 我想实现一种字段扩展 想要这样的结果C# 如何扩展类似于c中String.Empty的String.Space?,c#,C#,我正在尝试扩展System.String并添加一个静态字段String.Space,它表示一个单独的空间,就像Microsoft使用System;在命名空间中实现String.Empty一样;。我无法实现此扩展,请帮助 我想实现一种字段扩展 想要这样的结果 不幸的是,撰写本文时的框架v4.7目前不支持扩展属性/字段。看到这篇文章的好文章了吗 这意味着您只能使用扩展方法。 例如: namespace System.String { public static class Extension
不幸的是,撰写本文时的框架v4.7目前不支持扩展属性/字段。看到这篇文章的好文章了吗 这意味着您只能使用扩展方法。 例如:
namespace System.String
{
public static class Extensions
{
public static string Space(this string s)
{
return " ";
}
}
}
扩展方法需要对象的实例。因此,它可以这样使用:
// Returns " "
var space = "".Space();
或
这属于其中一类,虽然不漂亮,但它可以工作。您可以有一个这样的静态类
并在代码中使用它,如
FullName = FirstName + Strings.Space + MiddleName + Strings.Space + LastName;
然而,最终的目标是使代码可维护、合理高效并减少出错的可能性。记住这一点,最好减少连接的数量,只提供所需的值。为此,一个简单的格式字符串将是一个更干净的方法;前C6
FullName = string.Format("{0} {1} {2}", FirstName, MiddleName, LastName);
如果是C6+
FullName = $"{FirstName} {MiddleName} {LastName}";
为什么要使用最后两种方法?好吧,这归结为关注点的分离。将字符串格式设置为string.Format,只需提供所需的值。通过在混合中使用更少的组件来降低出错的可能性,通过减少执行串联所涉及的字符串数量来减少维护开销,并提高效率
编辑
至于为什么c不支持扩展属性,我将从c语言开发团队的中摘录一段引文
当然,很明显,扩展方法的自然伴侣是扩展属性。出于某种原因,不太明显的是,扩展事件、扩展操作符、扩展构造函数(也称为工厂模式)等也是自然的伙伴。但是我们甚至没有考虑设计C 3的扩展属性;我们知道这是没有必要的,并且会给已经很危险的计划增加风险,而不会带来令人信服的收益
基本上,它可以归结为不需要强制使用扩展属性来创建string.Space之类的东西。也许在未来的版本中。我能够做到以下几点。您将收到一个警告,但它会编译
namespace System
{
public static partial class String
{
public static string Space = " ";
}
}
致电:
string sp = String.Space;
在此处使用类字符串的别名。
像
使用String=StringFunctions.Extensions.StringExtensions
小字符串它是保留字,所以,它是抛出错误。如果你得到string.Space w=它的工作整个类的位置,其他字符串函数调用像string。清空你的函数调用string.Space像这样
using String = StringFunctions.Extensions.StringExtensions;
namespace StringFunctions
{
class Program
{
static void Main(string[] args)
{
var t = String.Space;
}
}
}
到目前为止你试过什么?你说不能实施是什么意思?请详细说明您为什么要这样做?检查此处的答案:可能重复@Tylerle虽然它确实回答了问题,但它不一定会使此问题重复。简单的变量空间=''如何?;或者另一个简单的var空间=MyConstants.space;将空格作为MyConstants类的公共只读属性?扩展方法只是语法糖,可以帮助您编写更漂亮的代码。使用它们来编写不漂亮的代码毫无意义。@GianPaolo我完全同意。我个人不会在这方面使用扩展。OP想要一个属性扩展,我只是提供了一个仍然符合扩展语法的替代方案。DiskJunky提供了其他非扩展建议,这是正确的。是的,我同意,但Microsoft实现了String.Empty,尽管我们可以使用char。因为@logix想发布它,所以我只提供了一个简单的例子。@rahulottarkar他们发布了,但是一个空格将是一个比这个更罕见的用例。正如@LindosPechos所说,没有扩展属性是有原因的——这就是你在OP中所做的。@RahulUttarkar这是过去几天的遗物。也许你会感兴趣。实际上我想扩展String对象而不是创建String新类你更好的方法是C 6,而不是7。你只扩展类中的方法,而不是属性或字段。唯一的方法是将别名扩展字段设置为仅此类型。某些保留字的工作方式与小写字母开头的字符串不同,因为它已经是System.StringAgreement的别名。如果使用字符串而不是字符串的代码约定,它也会导致任何系统出现问题。还是…非常有创意的方法。
string sp = String.Space;
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," ");
}
}
}
using String = StringFunctions.Extensions.StringExtensions;
namespace StringFunctions
{
class Program
{
static void Main(string[] args)
{
var t = String.Space;
}
}
}