Vra

Soos jy dalk reeds weet, is die .NET Framework's interne beskerm toegangswysiger werk op 'n vreemde manier:Dit beteken nie die klas is nie beskerm EN intern, dit sê die klas is beskerm OF intern;dit wil sê, die gewysigde klas of lid kan vanaf dieselfde samestelling verkry word sowel as uit dieselfde hiërargie.

So, met die wete:Wanneer sou jy dit gebruik?Kan jy 'n voorbeeld gee?Is daar 'n goeie, verhelderend gebruiksvoorbeeld binne .NET Base Class Library?

Was dit nuttig?

Oplossing

Ek het selde nodig gehad om hierdie toegangswysigerkombinasie te gebruik, aangesien ek dink dat dit in alle omstandighede behalwe die mees ekstreme omstandighede 'n aanduiding is van swak ontwerp.Soms is dit egter nodig om helperklasse soos tipe-omskakelaars en redigeerders toegang tot die metode binne jou samestelling te hê, maar laat slegs afgeleide klasse toe om toegang daartoe te kry in ander gebruiksgevalle.

'n Voorbeeld kan 'n oproep wees wat 'n tipe in 'n string vir die tipe-omskakelaar verander. ToString() word gewoonlik nie vir hierdie doel gebruik nie, so jy het dalk 'n ToPersistableString() oproep wat jy wil hê jou tipe omskakelaar moet gebruik, so jy maak dit internal.Dan besluit jy dat mense wat uit jou klas kom, dalk hierdie oproep wil gebruik as deel van hul eie volhardingskema vir hul afgeleide klas, sodat jy dit maak protected ook.

.NET Framework Gebruik
AccessibilityNotifyClients aan Control is protected internal.Met behulp van Reflektor, Ek kan sien dat dit gedoen is sodat die CheckedItemCollection van CheckListBox kan toegang daartoe kry wanneer gekontroleerde toestande verander word.

Ander wenke

Ek het dit gebruik vir interne metodes wat jy wil in staat wees om te gebruik in 'n aparte naam ruimte vir eenheid toets, die eenheid toets naam ruimte bevat 'n subklas van die klas. wat toegelaat word om die beskermde metodes te verkry word.

Dit gesê daar is 'n argument om alles openbaar vir eenheid toets te maak.

Ek wil graag 'n voorbeeld te voeg van ASP.Net MVC raamwerk:

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 */);
        }

}
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top