2009-02-08 15 views
6

Come eseguire l'override o l'estensione delle classi .net main. per esempioÈ possibile estendere la classe String in .net

public class String 
{ 
    public boolean contains(string str,boolean IgnoreCase){...} 
    public string replace(string str,string str2,boolean IgnoreCase){...} 
} 

dopo

string aa="this is a Sample"; 
if(aa.contains("sample",false)) 
{...} 

è possibile?

risposta

22

La classe String è sigillata, quindi non è possibile ereditarla. I metodi di estensione sono la soluzione migliore. Hanno lo stesso come come metodi di istanza senza il costo dell'ereditarietà.

public static class Extensions { 
    public static bool contains(this string source, bool ignoreCase) {... } 
} 

void Example { 
    string str = "aoeeuAOEU"; 
    if (str.contains("a", true)) { ... } 
} 

È necessario utilizzare VS 2008 per utilizzare i metodi di estensione.

+0

@JaredPar: una correzione, non è necessario VS 2008 per utilizzare i metodi di estensione. È necessario il compilatore C# per C# 3.0, che è in .NET 3.5. VS 2008 è solo l'IDE e non ciò che fornisce la funzionalità. – casperOne

+2

@casperOne, corretto. Di solito dico VS 2008 perché è più comunemente noto. Ciò che è ancora più divertente, è possibile compilare le applicazioni 2.0 con i metodi di estensione se si fornisce il proprio attributo Extension. http://blogs.msdn.com/jaredpar/archive/2007/11/16/extension-methods-without-3-5-framework.aspx – JaredPar

+3

@casperOne - per riaccenderlo, "o mono 2.0"; -p –

2

La classe String è sigillata, quindi non è possibile estenderla. Se si desidera aggiungere funzionalità, è possibile utilizzare i metodi di estensione o includerla in una classe personalizzata e fornire le funzionalità aggiuntive necessarie.

0

È inoltre possibile utilizzare un modello di adattatore per aggiungere funzionalità aggiuntive. Puoi fare l'overloading dell'operatore per farlo sembrare come la stringa incorporata. Naturalmente questo non sarà automatico per gli usi esistenti di "string", ma nemmeno la soluzione se ne erediterebbe direttamente, se fosse possibile.

1

In generale, dovresti provare a vedere se esiste un altro metodo che risponda alle tue esigenze in modo simile. Per il tuo esempio, Contains è in realtà un metodo wrapper per IndexOf, restituisce true se il valore restituito è maggiore di 0, altrimenti false. Come accade, il metodo IndexOf ha un numero di sovraccarichi, uno dei quali è IndexOf(string, StringComparison): Int32, che può essere specificato per onorare o ignorare il caso.

Vedere String.IndexOf Method (String, StringComparison) (System) per ulteriori informazioni, sebbene l'esempio sia un po 'strano.

Vedere StringComparison Enumeration (System) per le diverse opzioni disponibili quando si utilizza l'enumerazione StringComparison.

+0

è stata una buona idea – ebattulga

Problemi correlati