String gibi C # yerleşik türleri nasıl genişletilir?


91

Herkese selamlar ... Trima ihtiyacım var String. Ancak String'in içinde tekrarlanan tüm boşlukları kaldırmak istiyorum, yalnızca sonunda veya başlangıcında değil. Bunu şöyle bir yöntemle yapabilirim:

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

Buradan aldım . Ama bu kod parçasının String.Trim()kendi içinde çağrılmasını istiyorum , bu yüzden Trimyöntemi genişletmem veya aşırı yüklemem veya geçersiz kılmam gerektiğini düşünüyorum ... Bunu yapmanın bir yolu var mı?

Şimdiden teşekkürler.

Yanıtlar:


166

Uzatamayacağın için string.Trim(). Burada açıklandığı gibi beyaz boşlukları kesen ve azaltan bir Uzantı yöntemi oluşturabilirsiniz .

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+", " ");
        }
    }
}

Onu böyle kullanabilirsin

using CustomExtensions;

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

Sana verir

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

Dosyanın özel bir isme ihtiyacı var mı? Veya bunu nereye kaydediyorsunuz? Util sınıfına veya onun gibi bir şeye konulabilir mi?
test

1
@testing Projenizde referans gösterildikleri sürece onları istediğiniz yere koyabilirsiniz. Onları belirli bir ad alanına koyarsanız, onları diğer sınıflar gibi bir 'using' ifadesiyle getirin.
2014

Normal ifadeyi neden doğrudan TrimAndReduce işlevinden döndürmediniz? cevabınızı okumayı çok daha kolay hale getirebilirdi. Cevabınızı başka bir yerde aramanız gerekecek kadar çok kullanmadığınız sürece LOL
quemeful

24

Mümkün mü? Evet, ancak yalnızca bir uzatma yöntemiyle

Sınıf System.Stringmühürlenmiştir, böylece geçersiz kılma veya kalıtım kullanamazsınız.

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

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

5
Açık olmak gerekirse, hayır, gerçekleştirilen eylemleri değiştirmek mümkün değildir String.Trim.
Michael Petrotta

10

Sorunuzda bir evet ve bir hayır var.

Evet, uzantı yöntemlerini kullanarak mevcut türleri genişletebilirsiniz. Genişletme yöntemleri, doğal olarak, yalnızca türün genel arayüzüne erişebilir.

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

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

Hayır, bu yöntemi arayamazsınız Trim(). Uzatma yöntemleri aşırı yüklemeye katılmaz. Bir derleyicinin size bunu detaylandıran bir hata mesajı bile vermesi gerektiğini düşünüyorum.

Uzantı yöntemleri yalnızca yöntemi tanımlayan türü içeren ad alanı kullanılıyorsa görünür.


7

Uzatma yöntemleri!

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

2

Uzatma yöntemlerini kullanmanın yanı sıra - muhtemelen burada iyi bir adaydır - bir nesneyi "sarmak" da mümkündür (örneğin "nesne bileşimi"). Sarılmış form, sarılmakta olan şeyden daha fazla bilgi içermediği sürece, sarılmış öğe, hiçbir bilgi kaybı olmaksızın, örtük veya açık dönüştürmelerden temiz bir şekilde geçirilebilir: sadece bir tür / arayüz değişikliği.

Mutlu kodlamalar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.