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

319

这是有原因的吗?我问这个问题是因为如果您需要使用大量的空字符,那么您会遇到使用大量空字符串时相同的情况。

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

myString.Replace ('c', '')

请从myString中删除所有 'c' 的实例。


1
是的,我用那个词是因为没有更好的词了。即推荐使用String.Empty而不是“”。 - Joan Venge
3
如果你担心有时会因打错而出现问题,为什么不简单地将功能包装在扩展方法中,例如RemoveAll(this string s, params char[] toRemove)?这样就可以清晰地传达意图,同时避免出错。 - bzlm
12
我使用string.Empty的唯一原因是,我认为Empty提供的空对象比空引号更能表达意图。空引号可能来源于合并问题、思维混乱,或者本来就是代码的实际意图,而Empty明确告诉我开发人员打算让该字符串不包含数据。 - Ritch Melton
3
""和string.Empty之间有区别。虽然没有人真的关心,但是""会创建一个对象,而string.Empty则利用已经创建好的对象。但是这个区别非常小,在普通情况下不会有任何影响。 - marcelo-ferraz
4
关于@marcelo-ferrazm所说的“""创建一个对象”:不,它并没有这样做。 - H H
显示剩余2条评论
23个回答

6

char是一种值类型,因此它的值不能为null。(除非它被包装在可空容器中)。

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


3

虽然不能回答你的第一个问题,但是针对你遇到的特定问题,你可以使用字符串代替字符,是吗?

myString.Replace("c", "")

有没有任何理由不希望这样做?


3

2
您也可以逐个字符地重建字符串,排除您想要摆脱的字符。
这是一个扩展方法来实现这个功能:
    static public string RemoveAny(this string s, string charsToRemove)
    {
        var result = "";
        foreach (var c in s)
            if (charsToRemove.Contains(c))
                continue;
            else
                result += c;

        return result;
    }

虽然不太华丽,但它非常实用。

使用方法如下:

string newString = "My_String".RemoveAny("_"); //yields "MyString"

1
使用 StringBuilder 来存储 result。为什么不将 return s.Replace(charsToRemove,""); 包装起来呢? - aloisdg

1
这是我们的做法: myString.Replace('''.ToString(), "");

1

就C#语言而言,以下内容可能没有太多意义。这也不是对问题的直接回答。但以下是我在一个业务场景中所做的。

char? myCharFromUI = Convert.ToChar(" ");
string myStringForDatabaseInsert = myCharFromUI.ToString().Trim();
if (String.IsNullOrEmpty(myStringForDatabaseInsert.Trim()))
{
    Console.Write("Success");
}

在我的项目中,nullwhite space有不同的业务流程。在插入数据库时,如果是white space,我需要将empty string插入到数据库中。请保留HTML标签。

1
如果您想删除满足特定条件的字符,可以使用以下代码:
string s = "SoMEthInG";
s = new string(s.Where(c => char.IsUpper(c)).ToArray());

(这将使字符串中只保留大写字符。)

换句话说,您可以将字符串“使用”为 IEnumerable<char>,对其进行更改,然后像上面所示将其转换回字符串。

同样,这不仅因为 lambda 表达式而能够删除特定字符,尽管如果您更改 lambda 表达式,也可以这样做: c => c != 't'


1
如果您想消除字符串中的空字符,以下方法将起作用。只需将其转换为您想要的任何数据类型表示即可。
private void button1_Click(object sender, EventArgs e)
{

    Int32 i;

    String name;

    Int32[] array_number = new int[100];

    name = "1 3  5  17   8    9    6";

    name = name.Replace(' ', 'x');

    char[] chr = name.ToCharArray();


    for (i = 0; i < name.Length; i++)
    {
        if ((chr[i] != 'x'))
        {
            array_number[i] = Convert.ToInt32(chr[i].ToString());
            MessageBox.Show(array_number[i].ToString());
        }
    }
}

1

我知道这个问题很老,但最近遇到了一个问题,需要进行多次替换才能使文件名变得安全。首先,在最新的.NET string.Replace函数中,null等同于空字符。话虽如此,.Net缺少一个简单的替换所有字符的功能,可以用所需字符替换数组中的任何字符。请随意参考下面的代码(在LinqPad中运行以进行测试)。

// LinqPad .ReplaceAll and SafeFileName
void Main()
{

    ("a:B:C").Replace(":", "_").Dump();                     // can only replace 1 character for one character => a_B_C
    ("a:B:C").Replace(":", null).Dump();                    // null replaces with empty => aBC
    ("a:B*C").Replace(":", null).Replace("*",null).Dump();  // Have to chain for multiples 

    // Need a ReplaceAll, so I don't have to chain calls


    ("abc/123.txt").SafeFileName().Dump();
    ("abc/1/2/3.txt").SafeFileName().Dump();
    ("a:bc/1/2/3.txt").SafeFileName().Dump();
    ("a:bc/1/2/3.txt").SafeFileName('_').Dump();
    //("abc/123").SafeFileName(':').Dump(); // Throws exception as expected

}


static class StringExtensions
{

    public static string SafeFileName(this string value, char? replacement = null)
    {
        return value.ReplaceAll(replacement, ':','*','?','"','<','>', '|', '/', '\\');
    }

    public static string ReplaceAll(this string value, char? replacement, params char[] charsToGo){

        if(replacement.HasValue == false){
                return string.Join("", value.AsEnumerable().Where(x => charsToGo.Contains(x) == false));
        }
        else{

            if(charsToGo.Contains(replacement.Value)){
                throw new ArgumentException(string.Format("Replacement '{0}' is invalid.  ", replacement), "replacement");
            }

            return string.Join("", value.AsEnumerable().Select(x => charsToGo.Contains(x) == true ? replacement : x));
        }

    }

}

-1

那么BOM呢?这是微软添加到文件开头(至少是XML)的神奇字符。


这里维基百科的措辞非常不幸;在这个上下文中,BOM 不是一个字符。那么你的问题确切是什么? :) - bzlm
@onemach,所以,是否可以通过myString.Replace('c', UTF_BOM)来实现myString.Replace('c', '')。那么我的回答是“怎么可能呢...”。 - bzlm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接