C# 如何扩展类似于c中String.Empty的String.Space?

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

我正在尝试扩展System.String并添加一个静态字段String.Space,它表示一个单独的空间,就像Microsoft使用System;在命名空间中实现String.Empty一样;。我无法实现此扩展,请帮助

我想实现一种字段扩展

想要这样的结果


不幸的是,撰写本文时的框架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;

        }

    }
}