Laiendusmeetodid (C# 3.0)

26.10.2007  |  Gunnar

Laiendusmeetodid (C# 3.0) C# 3.0 toob endaga kaasa nii mõndagi uut ja huvitavat. Üheks uueks asjaks on laiendusmeetodid (extension methods), mille abil saab laiendada olemasolevate klasside funktsionaalsust.

Nii mõnigi kord on käinud peast läbi mõte, et oleks hea kui sellel või teisel klassil oleks see või teine meetod küljes. Veebi keskkondades, kes on oma elus kokku puutunud ka PHP-ga, teab kui mugav PHP funktsioon on nl2br(). Samuti MD5().

Seni on pidanud need funktsioonid paigutama kuhugi mujale ja kutsuma siis mõne utility klassi staatilisi meetode, mis muudavad koodi teinekord küllaltki kohmakaks. Laiendusmeetodite abil saab aga need meetodid tuua vastavate objektide külge ning kasutada neid nii nagu need oleks seal koguaeg olnud.

Nl2Br() ja MD5()

Järgmiseks näide, kuidas kirjutada stringile juurde PHP-st tuntud nl2br() ja MD5() meetodid. nl2br() osas tegin omapoolse täienduse, et Windowsi formaadis reavahetustest ei jääks järgi üksikut carriage return-i (\r).

Laiendusmeetodid tuleb defineerida mõnes staatilises klassis staatiliste meetoditena. Näites kasutan ma staatilist klassi StringExtensions. Klass ise on järgmine.

using System;
using System.Security.Cryptography;
using System.Text;

namespace MyExamples
{
    /// <summary>
    /// Klass stringi laiendusmeetodite jaoks.
    /// </summary>
    static class StringExtensions
    {
        /// <summary>
        /// Asendab antud stringis Windowsi ja Unixi reavahetused HTML-i
        /// reavahetuse märgiga.
        /// </summary>
        public static string Nl2Br(this string s)
        {
            return s.Replace("\r\n", "<br />").Replace("\n", "<br />");
        }

        /// <summary>
        /// Koostab antud stringist MD5-algoritmiga krüpteeritud stringi
        /// hex baitide jadana.
        /// </summary>
        public static string MD5(this string s)
        {
            MD5CryptoServiceProvider provider;
            provider = new MD5CryptoServiceProvider();
            byte[] bytes = Encoding.UTF8.GetBytes(s);
            StringBuilder builder = new StringBuilder();

            bytes = provider.ComputeHash(bytes);
           
            foreach (byte b in bytes)
                builder.Append(b.ToString("x2").ToLower());
           
            return builder.ToString();
        }
    }
}

Järgmiseks kasutan StringExtensions klassi lihtsas konsooli rakenduses, millega proovin neid funktsioone ühe stringi peal. Minu pisikese rakenduse Main() meetod on järgmine.

static void Main(string[] args)
{
    string s = "Esimene\r\nTeine\nKolmas";
    Console.WriteLine(s.Nl2Br());
    Console.WriteLine(s.MD5());
    Console.Write("Vajuta suvalist nuppu... ");
    Console.ReadLine();
}

Tulemuseks on konsoolil sellised read.

    Esimene<br />Teine<br />Kolmas
    e7f4be73c7ccb8cde076e3bcd566c745
    Vajuta suvalist nuppu...

Päris mugav, mis? :)

Kokkuvõtteks

Nagu näeme on laiendusmeetodid päris võimsaks vahendiks, millega muuta koodi kirjutamine mõningatel juhtudel senisest mugavamaks.

Siiski peab hoiatama agaramaid kirjutajaid, kes arhitektuuril ja disainil peatuma ei kipu, et laiendusmeetodite mõtlematu kasutamine lõpeb suhteliselt keerukalt hallatava koodiga.

Samuti on soovitatav kasutada laiendusmeetode on ainult siis, kui seda tõesti vaja on. Vältida tuleks olukordi, kus samale tüübile leidub mitu sama nimelist laiendusmeetodi. Täpsema ülevaate annab laiendusmeetoditest Sahil Malik oma blogi kandes Demystifying C# 3.0 - Part 3: Extension Methods.

Kommenteeri

sulge
Saada link e-postiga

© DT 2013 | Creative Commons Attribution-Noncommercial 3.0 License | WordPress