String.Empty와 같은 Char.Empty가없는 이유는 무엇입니까?


259

이것에 대한 이유가 있습니까? 빈 문자를 많이 사용해야하는 경우 빈 문자열을 많이 사용할 때와 같은 상황에 처하기 때문에 묻습니다.

편집 :이 사용법의 이유는 다음과 같습니다.

myString.Replace ('c', '')

따라서 myString에서 'c'의 모든 인스턴스를 제거하십시오.


1
그래, 나는 그 단어를 더 나은 단어가 없어서 사용했다. 즉, ""대신 String.Empty를 사용하는 것이 좋습니다.
Joan Venge

3
실수로 엉뚱한 것을 걱정하는 경우가 종종 있습니다 .``라고 단순히 기능을 확장 방법으로 감싸는 이유 는 RemoveAll(this string s, params char[] toRemove)무엇입니까? 의도가 명확하게 전달되고 어떤 것도 잘못 착각 할 위험이 없습니다.
bzlm

12
@Henk-string.Empty를 사용하는 유일한 이유는 Empty에서 제공하는 null 객체가 빈 따옴표보다 의도를 더 잘 표현하기 때문입니다. 빈 따옴표는 병합 문제 또는 엉뚱한 생각에서 비롯되거나 해당 코드의 실제 의도 일 수 있지만, Empty는 개발자가 해당 문자열에 데이터를 가지지 않도록 의도했음을 명시 적으로 알려줍니다.
Ritch Melton

3
""와 (과) 문자열에는 차이가 있습니다. ""는 객체를 만드는 반면 string.Empty는 이미 만든 객체를 사용합니다. 그러나 다시 말하지만, 그것은 아주 작기 때문에 특별한 상황 만이 차이를 만들 것입니다
marcelo-ferraz

1
@ marcelo-ferrazm, about ""객체 생성 : 아니요, 그렇지 않습니다.
Henk Holterman

답변:


271

빈 문자와 같은 것은 없습니다. 가장 가까운 '\0'것은 유니 코드 "널"문자입니다. 문자열 리터럴에 포함하거나 매우 쉽게 표현할 수 있다면 왜 별도의 필드를 원할까요? 마찬가지로는 "이 혼동하기 쉬운 """ "인수가 적용되지 않습니다" '\0'.

어디에서 사용하고 싶고 왜 더 좋을지에 대한 예를들 수 있다면 도움이 될 것입니다 ...


2
\ 0이 '바이트 배열의 끝'문자가 아닌가? 아니면 다른 것과 혼동됩니까?
Bertvan

5
@Bertvan : 바이트 배열 의 끝에 문자 가있는 이유는 무엇 입니까? 그래도 "널 종료"문자열에 사용됩니다.
Jon Skeet

35
Char.MinValue는 '\ 0'보다 낫습니다
Aliostad

10
@Aliostad : 관심 분야, 비슷한 필드가있는 경우 Int32.Zero리터럴 0 대신 해당 필드를 사용 하시겠습니까? 그렇지 않다면 차이점은 무엇입니까?
Jon Skeet

7
@Adam, @Jon-bell의 코드는 무엇입니까? 아니면 백 스페이스가 더 좋다고 생각하십시오 ... 아니면 어쩌면 Char.Backspace를 쓰는 것이 더 낫다고 생각 하는가? 또 다른 이유-종료자를 위해 '0'을 쓰는 것이 낫다고 말하지만 대신 Char.Terminator를 말하십시오. 그렇지 않습니다-오타 (완전히 컴파일, 위 참조)를 만들기가 너무 쉽지만 쓰기를 시도하십시오. Char. 터미네이터. 확인할 수없는 원시 가치를 피해야 할 충분한 이유가 있습니다 (어리석은 오타 때문에 우주 임무가 실패했습니다).
greenoldman

87

문자열과 달리 문자는 고정 된 크기를 가진 별개의 것입니다. 문자열은 실제로 문자 컨테이너입니다.

따라서 Char.Empty는 해당 맥락에서 실제로 의미가 없습니다. 문자가 있으면 비어 있지 않습니다.


3
정확히 맞습니다. 컨테이너가 비어 있는지 여부를 묻는 것이 좋습니다. int 또는 float 또는 char이 비어 있는지 묻는 것은 의미가 없습니다.
TED

1
@Joe : 그렇다면 문자열이 비어 있지 않은 문자의 모음이라면 어떻게 문자열을 비울 수 있습니까? 아마 바보, 미안 ...
user1477388

9
문자열은 개별 개체가 아니기 때문에 컬렉션입니다. 바위 양동이를 생각하십시오. 나는 빈 바위를 가질 수 없습니다. 그러나 빈 통을 가질 수 있습니다.
Joe

2
"문자는 기본, 값 유형이고 문자열은 기본이 아닌 참조 유형"으로 표현합니다.
samis

3
이것이 실제 답변입니다.
Gandalf458


28

사용 Char.MinValue'\ 0'과 동일하게 작동합니다. 그러나와 같지 않도록주의하십시오 String.Empty.


고마워, 전에 본 적이 없어. myString.Replace ( 'c', Char.MinValue)에서 작동하는지 알고 있습니까? 나는 그것을 시도해야합니다.
Joan Venge

19

널 입력 가능 문자를 사용할 수 있습니다 .

char? c

이것은 ''를 허용합니까? 아니면 그냥 null?
Joan Venge

귀하의 경우 다음과 같이 할 수 있습니다 : myString.Replace ( "c", (c == null? "": c.ToString ()))
paquetp

12

전체 문자열이 필요하지 않으면 지연된 실행을 활용할 수 있습니다.

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

여러 문자를 결합 할 수도 있습니다 ...

string veryLongText = "abcdefghijk...";

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

... 첫 7 자만 평가됩니다 :)

편집 : 또는 훨씬 더 :

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

그리고 그 사용법 :

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

@Joan : 감사합니다 ... "천재"그것은 조금 과장 경우에도 : P는 (removingChars가 ... 큰 배열 될 때 나는 그것의 공연에 대해 알고하지 않습니다)
Notoriousxl

1
어제 잊어 버렸습니다 : 결과 변수 "firstFiveCharsWithoutCsAndDs"를 어떻게 사용하고 있는지주의하십시오. 다른 "yield"메소드 (LINQ와 같은 메소드)에 전달하지 않으려면 "Take (5)"뒤에 ".ToArray ()"를 즉시 호출하십시오. 그렇지 않으면 "RemoveChars + Take" 체인은 "전통적인"방식으로 변수에 액세스 할 때마다 (예 : "Count ()"를 호출 할 때마다 또는 "수율 반환"이없는 foreach에서 순회 할 때) 실행됩니다.
Notoriousxl

좋은 생각 +1. 그러나 이것은 기본 접근 방식만큼 유지 관리 가능하거나 효율적으로 얻을 수 없습니다 :)
nawfal

1
@nawfal 효율성 측면에서는 옳지 만 myString.Except ( "c")는 myString.Replace ( 'c', '') : P보다 선언적이라고 생각합니다 .myString.Except ( "aeiou"))
Notoriousxl

7
myString = myString.Replace('c'.ToString(), "");

.Replace 메서드에는 문자열 매개 변수를 사용하는 오버로드가 있으므로 문자를 제거하는 데 특히 적합하지 않습니다. 그러나 이것은 캐리지 리턴, 줄 바꿈, 탭 등을 제거하는 데 효과적입니다.이 예에서는 탭 문자를 제거합니다.

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

6

같은 이유가 없습니다 int.Empty. 컨테이너는 비워 둘 수 있습니다. 스칼라 값은 될 수 없습니다. 비어 있지 않은 0을 의미하는 경우을 사용하십시오 '\0'. 당신이 의미하는 경우 null, 다음 사용 null:


2
char가 ValueType이므로 null을 사용할 수 없습니다. 문자를 사용해야합니까? null을 할당 할 수 있습니다.
Femaref

당신은 그것을 nullable로 만들 수 있습니다. 내 답변보기
paquetp

5

문자는 값 유형이므로 해당 값은 null 일 수 없습니다. (널링 가능 컨테이너에 싸여 있지 않은 경우).

null 일 수 없으므로 in에는 숫자 코드가 포함되어 있으며 각 코드는 일부 문자에 매핑됩니다.


4

아니라 귀하의 질문에 대답하지만, 기본적으로 나타 내기 위해 char당신은 그냥 사용할 수 있습니다

default(char)

어느 char.MinValue것과 동일합니다 \0. 빈 문자열과 같은 경우에는 사용하지 않아야합니다.


1

첫 번째 질문에 대답하지는 않지만 특정 문제에 대해서는 문자 대신 문자열을 사용할 수 있습니다.

myString.Replace("c", "")

그렇게하고 싶지 않은 이유가 있습니까?


1

제거하려는 문자를 제외하고 문자별로 문자열 문자를 다시 작성할 수도 있습니다.

이를 수행하는 확장 방법은 다음과 같습니다.

    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"

사용 StringBuilder을 위해 result. 왜 포장하지 return s.Replace(charsToRemove,"");않습니까?
aloisdg codidact.com으로 이동

1

특정 조건을 만족하는 문자를 제거하려면 다음을 사용할 수 있습니다.

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

(문자열에는 대문자 만 남습니다.)

즉, 문자열을로 사용 IEnumerable<char>하고 변경 한 다음 위에 표시된대로 다시 문자열로 변환 할 수 있습니다.

람다 식을 다음과 같이 변경하면 그렇게 할 수 있지만 람다 식으로 인해 특정 문자 만 제거 할 수는 없습니다 c => c != 't'.


0

방법에 대한 BOM , Microsoft는 파일을 시작으로 추가 마법 문자 (적어도 XML)?


Wikipedia의 문구는 매우 불행합니다. BOM은이 문맥에서 문자가 아닙니다. 그리고 당신의 질문은 정확히 무엇입니까? :)
bzlm

@onemach, 그래서에 myString.Replace ('c', '')의해 달성 될 수 있는지 여부 myString.Replace ('c', UTF_BOM). 그럼 대답은 "어떻게 말하고 싶지만 하지 에 대해 ...".
bzlm

0

문자열에서 빈 문자를 제거하려면 다음이 작동합니다. 원하는 데이터 유형 표현으로 변환하십시오. 감사,

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

        }

    }

0

C # 언어의 관점에서 보면 다음과 같은 의미가 없습니다. 그리고 이것은 질문에 대한 직접적인 대답이 아닙니다. 하지만 닭살이는 비즈니스 시나리오 중 하나에서 한 일입니다.

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

null하고 white space있었다 다른 비즈니스 내 프로젝트에 흐른다. 데이터베이스에 삽입하는 동안 empty string공백 인 경우 데이터베이스 에 삽입해야 합니다.


0

나는 이것이 오래되었다는 것을 알고 있지만 최근에 파일 이름을 안전하게 만들기 위해 여러 번 교체 해야하는 문제가 발생했습니다. 먼저 최신 .NET 문자열에서 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));
        }

    }

}

-3

사용하다

myString.Replace ("c", "")

2
이것은 Ian Grainger의 2013 년 답변의 사본입니다.
Joe Gayetty

-3

문자열에서 문자를 담요로 제거하는 가장 쉬운 방법은 자르는 것입니다.

cl = cl.Trim(' ');

문자열에서 모든 공백을 제거합니다


다른 공백을 제거하는 단점과 함께 .Replace ( 'c', '')를 사용하려는 경우에 유용합니다. 그러나 다른 많은 답변보다 도움이됩니다.
Jan

1
아니 이건 잘못이야! 트림은 중간에 있지 않은 문자열의 시작과 끝에서만 문자를 제거합니다
userSteve
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.