336

Is there a reason for this? I am asking because if you needed to use lots of empty chars then you get into the same situation as you would when you use lots of empty strings.

Edit: The reason for this usage was this:

myString.Replace ('c', '')

So remove all instances of 'c' from myString.

6
  • 3
    If you're concerned about accidentally mistyping '' sometimes, why not just simply wrap the functionality in an extension method along the lines of RemoveAll(this string s, params char[] toRemove)? The intent will be clearly communicated and you will not risk mistyping anything. Commented Oct 5, 2010 at 11:38
  • 13
    @Henk - The only reason I use string.Empty is because I find the null object provided by Empty expresses intent better than empty quotes. Empty quotes could result from a merge problem, or a bungled thought, or it could be the actual intent of that code, whereas Empty explicitly tells me that the developer intended for that string not to have data. Commented May 21, 2011 at 0:33
  • 3
    There is a difference between "" and the string.Empty. Not that anyone care, really, but "" creates an object, whereas string.Empty makes use of one already made. But again, it is so small, that only special situations it would make a diference Commented Nov 30, 2011 at 12:35
  • 6
    @marcelo-ferrazm, about "" creates an object : No, it does not. Commented Apr 22, 2019 at 17:43
  • Related post - How does one represent the empty char? Commented Sep 24, 2021 at 6:22

23 Answers 23

328

There's no such thing as an empty char. The closest you can get is '\0', the Unicode "null" character. Given that you can embed that within string literals or express it on its own very easily, why would you want a separate field for it? Equally, the "it's easy to confuse "" and " "" arguments don't apply for '\0'.

If you could give an example of where you'd want to use it and why you think it would be better, that might help...

Sign up to request clarification or add additional context in comments.

27 Comments

Isn't the \0 the 'end of the byte array'-character? Or am I confusing with something else?
@Bertvan: Why would there be a character at the end of a byte array? It's used for "null terminated" strings though, yes.
Char.MinValue is better than '\0'
@Aliostad: Out of interest, if there was a similar field for Int32.Zero, would you use that instead of the literal 0? If not, what's the difference here?
@Adam, @Jon -- what is the code for bell? Or backspace better, think think... Or maybe instead of thinking it is just better to write Char.Backspace? Another reason -- you say it is better to write '0' for terminator, instead, say Char.Terminator, however it is not -- it is too easy to make a typo (fully compiled, see above), but try to write Char.Termnator. There are enough reasons for me to avoid non-checkable, raw values (space missions failed because of stupid typos like that).
|
230

The reason for this usage was this: myString.Replace ('c', '') So remove all instances of 'c' from myString.

To remove a specific char from a string you can use the string overload:

 myString = myString.Replace ("c", String.Empty);

Your statement

 myString.Replace ('c', '\0')

Won't remove any characters. It will just replace them with '\0' (End-Of-String, EOS), with varying consequences. Some string operations might stop when encountering an EOS but in .NET most actions will treat it like any other char. Best to avoid '\0' as much as possible.

5 Comments

I wish this was voted up more, because this is the actual solution.
@OrenMazor, no, it isn't. This answer doesn't even try to answer the question. The question was "Why is there no Char.Empty like String.Empty?"
@DavidMurdoch - yes, the question is not always what it seems to be.
Or var s = new string("1234567890".Where(c => c != '5').ToArray()); if you want to stay in "character-mentality mode". Which also explains why the string version of Replace is probably more maintainable. ;^D
Where do you get EOS as the name of this character from? The standard mnemonic for it is NUL. It's true that in C and some related languages it's used as a string terminator, and accordingly the native Windows API uses it as such, but I'm not sure whether it functions as such anywhere in C#/.NET.
107

A char, unlike a string, is a discrete thing with a fixed size. A string is really a container of chars.

So, Char.Empty doesn't really make sense in that context. If you have a char, it's not empty.

4 Comments

Exactly right. It makes sense to ask if a container is empty or not. It makes no sense to ask of a int or float or char is empty.
@Joe: Then how can a string be empty if a string is a collection of (non-empty) chars? Probably stupid, sorry...
Because a string isn't the individual objects, it's the collection. Think of a bucket of rocks. I can't have an empty rock. But I can have an empty bucket.
I would phrase it as "a char is a primitive, value type, and a string is non-primitive, reference type".
38

There's no such thing as an empty character. It always contains something. Even '\0' is a character.

Comments

31

Use Char.MinValue which works the same as '\0'. But be careful it is not the same as String.Empty.

1 Comment

Thanks, haven't seen that before. Do you know if it work in myString.Replace('c', Char.MinValue)? I should give it a try.
20

You could use nullable chars.

char? c

2 Comments

This allows ''? Or just null?
In your case, you could do this: myString.Replace("c", (c == null ? "" : c.ToString()))
16

Not an answer to your question, but to denote a default char you can use just

default(char)

which is same as char.MinValue which in turn is same as \0. One shouldn't use it for something like an empty string though.

Comments

13

If you don't need the entire string, you can take advantage of the delayed execution:

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

You can even combine multiple characters...

string veryLongText = "abcdefghijk...";

IEnumerable<char> firstFiveCharsWithoutCsAndDs = veryLongText
            .RemoveChar('c')
            .RemoveChar('d')
            .Take(5);

... and only the first 7 characters will be evaluated :)

EDIT: or, even better:

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

and its usage:

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

4 Comments

@Joan: thanks... even if "Genius" it's a bit exaggerated :P (I don't know about its performances when removingChars will become a big array...)
Yesterday I forgot: pay attention on how you are using the result variable "firstFiveCharsWithoutCsAndDs". If you don't want to pass it to another "yield" method (like those of LINQ), call immediately a ".ToArray()" after the "Take(5)"... otherwise, the "RemoveChars + Take" chain will be executed every time you access the variable in a "traditional" fashion (for example, every you call a "Count()" on it, or when you traverse it in a foreach without "yield return")
+1 nice thinking. but this can't get as maintainable or efficient as the basic approach :)
@nawfal efficiency-wise you're right, but I think that myString.Except("c") is more declarative than myString.Replace('c', '') :P (and it scales pretty well: myString.Except("aeiou"))
13
myString = myString.Replace('c'.ToString(), "");

OK, this is not particularly elegant for removing letters, since the .Replace method has an overload that takes string parameters. But this works for removing carriage returns, line feeds, tabs, etc. This example removes tab characters:

myString = myString.Replace('\t'.ToString(), "");

1 Comment

Doesn't myString = myString.Replace("\t", ""); work, is shorter and more clear?
8

The same reason there isn't an int.Empty. Containers can be empty, scalar values cannot. If you mean 0 (which is not empty), then use '\0'. If you mean null, then use null :)

2 Comments

null is not possible as char is a ValueType. You'd have to use char? to be able to assign null to it.
you chould make it nullable. see my answer
6

A char is a value type, so its value cannot be null. (Unless it is wrapped in a Nullable container).

Since it can't be null, in contains some numeric code and each code is mapped to some character.

Comments

4

If you look at the documentation for Replace(String, String) overload for String.Replace you can see in the remarks section that if the second argument is a null then it will remove all instances of what you specified. Therefore if you just use myString = myString.Replace("c", null); it will delete every c in the string.

Comments

3

Doesn't answer your first question - but for the specific problem you had, you can just use strings instead of chars, right?:

myString.Replace("c", "")

There a reason you wouldn't want to do that?

Comments

2

You can also rebuild your string character by character, excluding the characters that you want to get rid of.

Here's an extension method to do this:

    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;
    }

It's not slick or fancy, but it works well.

Use like this:

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

1 Comment

Use a StringBuilder for result. Why not wrap return s.Replace(charsToRemove,"");?
1

I know this one is pretty old, but I encountered an issue recently with having to do multiple replacements to make a file name safe. First, in the latest .NET string.Replace function null is the equivalent to empty character. Having said that, what is missing from .Net is a simple replace all that will replace any character in an array with the desired character. Please feel free to reference the code below (runs in LinqPad for testing).

// 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));
        }

    }

}

Comments

1

If you want to remove characters that satisfy a specific condition, you may use this:

string s = "SoMEthInG";
s = new string(s.Where(c => char.IsUpper(c)).ToArray());

(This will leave only the uppercase characters in the string.)

In other words, you may "use" the string as an IEnumerable<char>, make changes on it and then convert it back to a string as shown above.

Again, this enables to not only remove a specific char because of the lambda expression, although you can do so if you change the lambda expression like this: c => c != 't'.

Comments

1

In terms of C# language, the following may not make much sense. And this is not a direct answer to the question. But following is what I did in one of my business scenarios.

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

The null and white space had different business flows in my project. While inserting into database, I need to insert empty string to the database if it is white space.

Comments

1

If you want to eliminate the empty char in string, the following will work. Just convert to any datatype representation you want.

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());
        }
    }
}

Comments

1

here is how we do it : myString.Replace ('''.ToString(), "");

Comments

-1

How about BOM, the magical character Microsoft adds to start of files (at least XML)?

2 Comments

The wording on Wikipedia here is quite unfortunate; the BOM is not a character in this context. And what is your question exactly? :)
@onemach, so, whether myString.Replace ('c', '') could be achieved by myString.Replace ('c', UTF_BOM). Then I'd say the answer is "how not about...".
-1
public static string QuitEscChars(this string s) 
{
    return s.Replace(((char)27).ToString(), "");
}

1 Comment

Hello! While this code may solve the question, including an explanation of how and why this solves the problem would really help to improve the quality of your post, and probably result in more up-votes. Remember that you are answering the question for readers in the future, not just the person asking now. Please edit your answer to add explanations and give an indication of what limitations and assumptions apply.
-3

use

myString.Replace ("c", "")

1 Comment

This is a duplicate of an answer from 2013 by Ian Grainger.
-4

Easiest way to blanket remove a character from string is to Trim it

cl = cl.Trim(' ');

Removes all of the spaces in a string

2 Comments

This is helpful if one wants to use use .Replace('c', ' ') with the downside of removing other whitespaces. But its more helpful than lots of other answers given.
No this is wrong! Trim only remove chars from the start and end of a string not in the middle

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.