String과 같은 C # 기본 제공 유형을 확장하는 방법은 무엇입니까?


90

인사말 모든 사람이 ... 내가 필요 . 그러나 문자열의 끝이나 시작 부분뿐만 아니라 문자열 자체에서 반복되는 모든 공백을 제거하고 싶습니다. 다음과 같은 방법으로 할 수 있습니다.TrimString

public static string ConvertWhitespacesToSingleSpaces(string value)
{
    value = Regex.Replace(value, @"\s+", " ");
}

내가 여기서 얻은 . 하지만이 코드 부분이 String.Trim()자체적 으로 호출되기를 원 하므로 Trim메서드 를 확장하거나 오버로드하거나 재정의해야한다고 생각합니다. 그렇게 할 수 있는 방법이 있습니까?

미리 감사드립니다.

답변:


165

당신은 확장 할 수 없습니다 때문에 string.Trim(). 여기 에 설명 된대로 공백을 자르고 줄이는 Extension 메서드를 만들 수 있습니다.

namespace CustomExtensions
{
    //Extension methods must be defined in a static class
    public static class StringExtension
    {
        // This is the extension method.
        // The first parameter takes the "this" modifier
        // and specifies the type for which the method is defined.
        public static string TrimAndReduce(this string str)
        {
            return ConvertWhitespacesToSingleSpaces(str).Trim();
        }

        public static string ConvertWhitespacesToSingleSpaces(this string value)
        {
            return Regex.Replace(value, @"\s+", " ");
        }
    }
}

그렇게 사용할 수 있습니다

using CustomExtensions;

string text = "  I'm    wearing the   cheese.  It isn't wearing me!   ";
text = text.TrimAndReduce();

당신에게 준다

text = "I'm wearing the cheese. It isn't wearing me!";

파일에 특별한 이름이 필요합니까? 아니면 이것을 어디에 저장합니까? Util 클래스 또는 이와 유사한 것에 넣을 수 있습니까?
테스트

1
@testing 프로젝트에 참조되는 한 어디에나 둘 수 있습니다. 특정 네임 스페이스에 넣으면 다른 클래스와 마찬가지로 'using'문을 사용하여 가져 오십시오.
두 번

TrimAndReduce 함수에서 바로 정규식을 반환하지 않은 이유는 무엇입니까? 그것은 당신의 대답을 훨씬 더 읽기 쉽게 만들었을 것입니다. 당신은 당신이 다른 곳에서 LOL 호출 할 필요가 너무 많은 답변을 사용하지 않는 한
quemeful

24

가능합니까? 예,하지만 확장 방법이있는 경우에만

클래스 System.String는 봉인되어 있으므로 재정의 또는 상속을 사용할 수 없습니다.

public static class MyStringExtensions
{
  public static string ConvertWhitespacesToSingleSpaces(this string value)
  {
    return Regex.Replace(value, @"\s+", " ");
  }
}

// usage: 
string s = "test   !";
s = s.ConvertWhitespacesToSingleSpaces();

5
명확하게 말하면, 수행하는 작업을 수정할 수 없습니다 String.Trim.
Michael Petrotta

10

귀하의 질문에 예와 아니오가 있습니다.

예, 확장 메서드를 사용하여 기존 유형을 확장 할 수 있습니다. 확장 메서드는 당연히 유형의 공용 인터페이스에만 액세스 할 수 있습니다.

public static string ConvertWhitespacesToSingleSpaces(this string value) {...}

// some time later...
"hello world".ConvertWhitespacesToSingleSpaces()

아니요,이 메서드를 호출 할 수 없습니다 Trim(). 확장 메서드는 오버로딩에 참여하지 않습니다. 컴파일러가 이것을 자세히 설명하는 오류 메시지를 제공해야한다고 생각합니다.

확장 메서드는 메서드를 정의하는 형식이 포함 된 네임 스페이스가 using'ed 인 경우에만 표시됩니다.


7

확장 방법!

public static class MyExtensions
{
    public static string ConvertWhitespacesToSingleSpaces(this string value)
    {
        return Regex.Replace(value, @"\s+", " ");
    }
}

2

확장 방법을 사용하는 것 외에도 (여기서는 좋은 후보 일 가능성이 있음) 객체를 "포장"하는 것도 가능합니다 (예 : "객체 구성"). 래핑 된 양식에 래핑되는 것보다 더 많은 정보가 포함되지 않는 한 래핑 된 항목은 정보 손실없이 암시 적 또는 명시 적 변환을 통해 깔끔하게 전달 될 수 있습니다. 유형 / 인터페이스 만 변경하면됩니다.

즐거운 코딩입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.