Domanda

Come forse già saprai, protetto interno <. / em> il modificatore di accesso funziona in modo strano: non significa che la classe sia protetta E interna , dice la classe è protetta OPPURE interna ; vale a dire, è possibile accedere alla classe o al membro modificato dallo stesso assembly e dalla stessa gerarchia.

Quindi, sapendo questo: quando lo useresti? Puoi fare un esempio? Esiste un buon esempio di utilizzo illuminante nella libreria di classi .NET Base?

È stato utile?

Soluzione

Raramente ho avuto bisogno di usare questa combinazione di modificatori di accesso poiché penso che in tutte le circostanze, tranne in quelle estreme, sia un indicatore di cattiva progettazione. Tuttavia, a volte è necessario che classi helper come convertitori di tipi ed editor accedano al metodo all'interno dell'assembly, ma consentano alle classi derivate di accedervi solo in altri casi d'uso.

Un esempio potrebbe essere una chiamata che trasforma un tipo in una stringa per il convertitore di tipi. ToString () generalmente non viene utilizzato per questo scopo, quindi potresti avere una chiamata ToPersistableString () che vuoi usare dal tuo convertitore di tipi, quindi lo fai interno . Quindi decidi che le persone derivanti dalla tua classe potrebbero voler usare questa chiamata come parte del proprio schema di persistenza per la loro classe derivata, in modo da renderla anche protetta .

Uso di .NET Framework
AccessibilityNotifyClients su Control è protetto interno . Utilizzando Reflector , posso vedere che è stato fatto in modo che CheckedItemCollection di CheckListBox potrebbe accedervi quando si cambiano gli stati controllati.

Altri suggerimenti

L'ho usato per metodi interni che volevi poter usare in uno spazio dei nomi separato per i test unitari, lo spazio dei nomi dei test unitari conteneva una sottoclasse della classe. che ha consentito l'accesso ai metodi protetti.

Detto questo, c'è un argomento per rendere tutto pubblico per i test unitari.

Vorrei aggiungere un esempio dal framework ASP.Net MVC:

public abstract class Controller : ControllerBase, <Omitted Interfaces>
{
     protected internal ViewResult View() {
            return View(null /* viewName */, null /* masterName */, null /* model */);
        }

     protected internal ContentResult Content(string content) {
            return Content(content, null /* contentType */);
        }

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top