2010-01-18 13 views

risposta

19

Ciò è necessario per scenari come servizi remoti, la serializzazione, materializzazione, ecc Si consiglia di non usare ciecamente, ma notare che queste strutture hanno sempre stata disponibile in qualsiasi sistema (in sostanza, affrontando direttamente la memoria) . La reflection lo formalizza semplicemente e pone i controlli e gli assegni nel modo che non vedi perché presumibilmente stai correndo in "piena fiducia", quindi sei già più forte del sistema che viene protetto.

Se si prova questo in parziale fiducia, si vedrà molto più controllo sullo stato interno.

È un anti-pattern?

Solo se il codice viene utilizzato in modo inappropriato. Ad esempio, si consideri quanto segue (valido per un WCF Data-contratto):

[DataMember] 
private int foo; 

public int Foo { get {return foo;} set {foo = value;} } 

E 'corretto per WCF a sostegno di questa? Sospetto di no ... ci sono diversi scenari in cui si desidera serializzare qualcosa che non fa parte dell'API pubblica, senza avere un DTO separato. Allo stesso modo, LINQ-to-SQL si concretizzerà in membri privati ​​se lo scegli tu.

+0

Che cos'è * remoting *? –

+0

@Tomas un meccanismo non integrato per parlare tra domini app. Questi possono essere in-process o su macchine separate in paesi diversi. –

+0

"ci sono più scenari in cui si desidera serializzare qualcosa che non fa parte dell'API pubblica" - solo 2 possibilità: l'API è sbagliata e dovrebbe essere risolta o non è necessario serializzare quel "qualcosa". –

22

L'accessibilità dei membri non è una funzione di sicurezza. È lì per proteggere il programmatore da se stesso. Aiuta ad implementare l'incapsulamento ma non è affatto una funzionalità di sicurezza.

La riflessione è abbastanza noiosa da essere utilizzata in modo che le persone normalmente non si facciano il possibile per utilizzarla per accedere a membri non pubblici. È anche piuttosto lento. La riflessione è normalmente utilizzata solo in casi speciali. Tuttavia, nulla può proteggere completamente contro la stupidità umana, se qualcuno vuole abusare della riflessione può farlo facilmente, ma anche senza l'API di riflessione, possono ottenere la stessa cosa (se stanno correndo in piena fiducia, cioè) se sono abbastanza determinati

+3

+1 per "l'accessibilità dei membri non è una funzione di sicurezza". –

+1

+1 per lento .... –

-1

La riflessione è assolutamente necessaria per un debugger. Immagina di passare attraverso il tuo programma e di non vedere i valori delle tue variabili private. Questo è probabilmente il motivo per cui la reflection funziona in .NET e Java come funziona, per rendere il debug davvero facile.

Se non avessimo bisogno di debugger, quindi posso immaginare che la riflessione sarebbe limitata più nello spirito di OOP.

+13

Il debugger non usa il reflection; il debugger parla direttamente alle speciali interfacce di debug del CLR. Inoltre, poiché il debugger è completamente affidabile, può generare ed eseguire codice non verificabile che accede direttamente ai membri privati. –

+0

Il debugger esiste anche in linguaggi che normalmente non hanno riflessioni ([C++] (http://stackoverflow.com/q/359237/607407)) e nelle applicazioni binarie accede direttamente agli offset di memoria. –

3

Perché è specificato nel numero ECMA specification, 9 Metadata.

+0

Non riesco a trovare cosa intendi. Perché non usi le virgolette. Ho pensato che Stack Overflow non consentisse solo di pubblicare un link per qualche motivo ... –

Problemi correlati