为什么没有像String.Empty这样的Char.Empty?

Joa*_*nge 244 .net c# string char base-class-library

是否有一个原因?我问,因为如果你需要使用大量空字符,那么你会遇到与使用大量空字符串时相同的情况.

编辑:这种用法的原因是:

myString.Replace ('c', '')
Run Code Online (Sandbox Code Playgroud)

所以从myString中删除'c'的所有实例.

Jon*_*eet 257

没有像空炭一样的东西.你可以得到的最接近的是'\0'Unicode"null"字符.鉴于您可以将其嵌入到字符串文字中或者非常容易地表达它,为什么您需要一个单独的字段呢?同样,"它容易混淆""" ""的论点也不适用'\0'.

如果您可以举例说明您想要使用它的原因以及您认为它会更好的原因,那可能会有所帮助......

  • Char.MinValue胜于'\ 0' (34认同)
  • @Aliostad:出于兴趣,如果`Int32.Zero`有一个类似的字段,你会使用它而不是文字0吗?如果没有,这有什么区别? (10认同)
  • @Adam,@ Jon - 贝尔的代码是什么?或者退格更好,想想......或者可能不是认为编写Char.Backspace更好?另一个原因 - 你说最好为终结者写'0',而不是说Char.Terminator,但它不是 - 它太容易弄错(完全编译,见上文),但试着写Char.Termnator.我有足够的理由避免不可检查的原始值(太空任务失败,因为像这样的愚蠢的错别字). (7认同)
  • @Bertvan:为什么在*byte*数组的末尾会有*字符*?它用于"空终止"字符串,是的. (5认同)
  • 不是\ 0'字节数组的结尾'字符?还是我和别的东西混淆了? (2认同)
  • 这种速度很荒谬.最后,一个问题出现了,我实际上可以回答,并且它已经被'Skeeted (2认同)

Hen*_*man 186

这种用法的原因是:myString.Replace ('c', '') 所以'c'从 myString 中删除所有实例。

要从字符串中删除特定字符,您可以使用字符串重载:

 myString = myString.Replace ("c", String.Empty);
Run Code Online (Sandbox Code Playgroud)

你的陈述

 myString.Replace ('c', '\0')
Run Code Online (Sandbox Code Playgroud)

不会删除任何字符。它只会用'\0'(End-Of-String, EOS)替换它们,结果各不相同。遇到 EOS 时,某些字符串操作可能会停止,但在 .NET 中,大多数操作会将其视为任何其他字符。最好尽量避免'\0'

  • 我希望这被投票更多,因为这是实际的解决方案。 (19认同)
  • 多么新颖,问题的解决方案! (6认同)
  • @OrenMazor,不,不是。这个答案甚至没有试图回答这个问题。问题是“为什么没有像 String.Empty 这样的 Char.Empty?” (3认同)
  • @DavidMurdoch - 是的,问题并不总是看起来是什么。 (2认同)

Joe*_*Joe 80

与字符串不同,字符是具有固定大小的离散事物.字符串实际上是字符的容器.

所以,Char.Empty在这种情况下并没有真正意义.如果你有一个char,它不是空的.

  • 因为字符串不是单个对象,所以它是集合.想想一桶石头.我不能有一块空洞的岩石.但我可以有一个空桶. (9认同)
  • 非常正确.询问容器是否为空是有意义的.询问int或float或char是空的没有意义. (3认同)
  • 这才是真正的答案. (3认同)
  • 我将其表述为“ char是原始类型,值类型,而字符串是非原始类型,引用类型”。 (2认同)

Phi*_*ert 30

没有空角色这样的东西.它总是包含一些东西.甚至'\ 0'也是一个角色.


Ali*_*tad 26

使用Char.MinValue与'\ 0'的作用相同.但要小心它不一样String.Empty.


Not*_*sxl 10

如果您不需要整个字符串,则可以利用延迟执行:

public static class StringExtensions
{
    public static IEnumerable<char> RemoveChar(this IEnumerable<char> originalString, char removingChar)
    {
        return originalString.Where(@char => @char != removingChar);
    }
}
Run Code Online (Sandbox Code Playgroud)

你甚至可以组合多个角色......

string veryLongText = "abcdefghijk...";

IEnumerable<char> firstFiveCharsWithoutCsAndDs = veryLongText
            .RemoveChar('c')
            .RemoveChar('d')
            .Take(5);
Run Code Online (Sandbox Code Playgroud)

...并且只评估前7个字符:)

编辑:或者,甚至更好:

public static class StringExtensions
{
    public static IEnumerable<char> RemoveChars(this IEnumerable<char> originalString,
        params char[] removingChars)
    {
        return originalString.Except(removingChars);
    }
}
Run Code Online (Sandbox Code Playgroud)

及其用法:

        var veryLongText = "abcdefghijk...";
        IEnumerable<char> firstFiveCharsWithoutCsAndDs = veryLongText
            .RemoveChars('c', 'd')
            .Take(5)
            .ToArray(); //to prevent multiple execution of "RemoveChars"
Run Code Online (Sandbox Code Playgroud)


ten*_*our 6

同样的原因没有int.Empty.容器可以是空的.标量值不能.如果你的意思是0(这不是空的),那么使用'\0'.如果你的意思是null,那么使用null:)

  • 由于char是ValueType,因此无法使用null.你必须使用char吗?能够为它分配null. (2认同)

naw*_*fal 6

不是您问题的答案,而是表示char您可以使用的默认值

default(char)
Run Code Online (Sandbox Code Playgroud)

与 相同char.MinValue又与 相同\0。但是,不应将它用于诸如空字符串之类的东西。


epo*_*ter 5

char是值类型,因此其值不能为null.(除非它被包装在Nullable容器中).

由于它不能为null,因此包含一些数字代码,并且每个代码都映射到某个字符.


Mik*_*rne 5

myString = myString.Replace('c'.ToString(), "");
Run Code Online (Sandbox Code Playgroud)

好的,这对于删除字母来说不是特别好用,因为.Replace方法有一个采用字符串参数的重载。但这可以删除回车符,换行符,制表符等。此示例删除了制表符:

myString = myString.Replace('\t'.ToString(), "");
Run Code Online (Sandbox Code Playgroud)