Buona pratica OOP: parametro facoltativo di tipo di riferimento

1

Conosco in C #, per impostazione predefinita, le variabili di tipo referenziate sono passate per riferimento a un metodo. Ho una funzione che a volte ho solo bisogno del suo valore di ritorno e talvolta entrambi restituiscono il valore e le modifiche sull'oggetto di input sono necessarie al di fuori della funzione.

Quindi l'ho scritto come segue:

public static List<RuleSet> Load(XmlDocument dom= null)
{
   if (dom == null)
   {
       dom = new XmlDocument();
   }
   string path = ...
   dom.Load(path);
   List<RuleSet> ruleSets = new List<RuleSet>();
   // load the dom with file and read rules
   return ruleSets;
}

A volte ho bisogno del dom al di fuori della funzione e lo chiamo Load(dom) e quando ho solo bisogno del valore restituito lo chiamo Load() .

Tuttavia, so se il parametro è stato dichiarato con ref Non ho potuto impostare un valore predefinito per esso e ci deve essere un motivo per se, ma ora l'ho fatto senza problemi.

Quindi sospetto che il mio approccio al problema (la mia funzione sopra) sia corretto o no, o potrebbe essere implementato in un modo migliore?

    
posta Ahmad 07.01.2015 - 13:50
fonte

1 risposta

9

I know in C#, by default, objects are passed by reference

Questo non è corretto. In C #, i parametri vengono passati per valore per impostazione predefinita. Ma se quel parametro è un tipo di riferimento (come una classe o un'interfaccia), allora è il riferimento che viene passato per valore, non l'oggetto stesso. Se in realtà vuoi passare per riferimento, devi utilizzare ref o out .

However I know if the parameter was declared with ref I couldn't set a default value for it and there must be a reason for that

Sì, se un parametro è ref , significa sostanzialmente che si tratta di un alias di una variabile (variabile locale, campo o elemento di matrice). E un valore predefinito come null non è una variabile.

Quello che stai cercando potrebbe essere risolto utilizzando due overload anziché il valore predefinito:

public static List<RuleSet> Load(out XmlDocument dom)
{
    dom = new XmlDocument();
    // rest of the method here
}

public static List<RuleSet> Load()
{
    XmlDocument ignored;
    return Load(out ignored);
}

Usare ref XmlDocument dom e controllare null funzionerebbe, ma penso che sia meno chiaro. L'unico vantaggio che posso vedere è che ti permette di riutilizzare XmlDocument . Ma è quasi certamente un'ottica prematura.

    
risposta data 08.01.2015 - 01:42
fonte

Leggi altre domande sui tag