Come funzionano e ottengono i metodi di accesso

4

Il metodo standard per implementare get e set accessors in C # e VB.NET consiste nell'utilizzare una proprietà pubblica per impostare e recuperare il valore di una variabile privata corrispondente. Ho ragione nel dire che questo non ha alcun effetto delle diverse istanze di una variabile? Con questo intendo, se ci sono diverse istanze di un oggetto, allora quelle istanze e le loro proprietà sono completamente indipendenti, giusto? Quindi penso che la mia comprensione sia corretta che impostare una variabile privata sia solo un costrutto per essere in grado di implementare il modello get e set? Non sei mai stato sicuro al 100% di questo.

    
posta Johnny 29.10.2012 - 21:58
fonte

6 risposte

7

Hai risposto correttamente a questa domanda:

So I think my understanding is correct that setting a private variable is just a construct to be able to implement the get and set pattern?

È vero il contrario. Idealmente, solo l'oggetto incapsulante dovrebbe avere accesso diretto agli oggetti che incapsula. Questo è noto come Legge di Demetra .

In realtà, seguire questa "legge" (come la maggior parte delle leggi di programmazione) può portare religiosamente alla sovraingegneria, ma è un ottimo principio da tenere presente.

Effettua il cambiamento mentale in modo da giustificare l'esistenza di un getter, e separatamente un setter, prima di implementarli ciecamente per tutti i campi privati.

    
risposta data 29.10.2012 - 22:24
fonte
4

if there are different instantiations of an object, then those instances and their properties are completely independent

Sì, hai ragione.

So I think my understanding is correct that setting a private variable is just a construct to be able to implement the get and set pattern?

Non sei sicuro di cosa intendi con questo.

    
risposta data 29.10.2012 - 21:58
fonte
0

So I think my understanding is correct that setting a private variable is just a construct to be able to implement the get and set pattern?

È non vero . I setter privati incapsulano il valore e NON consentono l'accesso diretto alla proprietà della classe. È uno dei principi di programmazione ampiamente utilizzato in Sviluppo basato sul dominio .

    
risposta data 30.10.2012 - 00:27
fonte
0

Informazioni su questo:

So I think my understanding is correct that setting a private variable is just a construct to be able to implement the get and set pattern?

Puoi pensare a una proprietà come a un metodo che può fare molto di più che esporre semplicemente il campo sottostante. Una proprietà può anche fornire l'accesso a più di un campo privato.

Ad esempio, potresti avere un Invoice che avrebbe la proprietà TotalPrice . Questa proprietà restituirebbe quindi la somma di tutti i Item (che sarebbe una proprietà List<Item> sulla fattura) o qualcosa del genere.

In questo modo si incapsulano i meccanismi interni della fattura e si espone solo questa semplice proprietà. Nel metodo get della proprietà, potresti avere varie chiamate ad altri metodi o proprietà per calcolare il prezzo.

Il Item potrebbe avere campi privati per price e quantity e una proprietà Price che avrebbe return (price * quantity) . Potresti quindi aggiungere discount al mix e l'accesso a Price da qualunque cosa stia utilizzando Item rimarrà lo stesso.

Inoltre, puoi rendere la proprietà in sola lettura (nessun metodo set ), in cui puoi quindi modificare i prezzi degli articoli, ma non il totale direttamente, applicando in tal modo che i dati sono coerenti.

Trovo più utile pensare alle proprietà come metodi, piuttosto che ai campi, e lavorare con le proprietà consente di cambiare il modo in cui i dati vengono restituiti senza modificare ogni chiamata a quella proprietà (perché è possibile elaborare il campo prima di tornare, piuttosto quindi a titolo definitivo assegnando il campo al cliente).

    
risposta data 30.10.2012 - 16:20
fonte
0

Se osservi la Lingua intermedia del setter di seguito:

private string _bar;
private string Bar
{
    get
    {
        return this._bar;
    }
    set
    {
        this._bar = value;
    }
}

Quindi vedrai:

.method private hidebysig specialname instance string get_Bar() cil managed
{
    // Irrelevant to this question
}

Ora se ignori tutto all'interno di parentesi graffe, vedrai che funziona in modo simile ai normali metodi della tua classe. Puoi pensare a getter e setter come sintassi dello zucchero.

C'è un'intera discussione separata su quando dovresti usare le proprietà al posto dei metodi e quale modificatore di accesso dovrebbero avere, ma è fuori dall'ambito di questa domanda.

Infine, la lezione è solo un progetto. Una volta che istanziate un oggetto dal vostro progetto (classe), la sua logica è incapsulata, quindi l'accesso alle proprietà su questo oggetto non influisce su altri oggetti che sono stati istanziati dalla stessa classe.

Riferimento: link

    
risposta data 31.10.2012 - 00:42
fonte
0

OK scusa - rileggendo la mia domanda non era chiara al 100%, quindi ecco la spiegazione combinata sull'uso di get / set per aiutare gli altri che vogliono conoscere la logica dell'uso di questo modello (grazie PDR - Ho ha migliorato la tua risposta che è stata la più utile nel costruire questa spiegazione):

  • il modello get / set nella programmazione orientata agli oggetti (incluso in .NET), è un pattern simile a questo (in VB.Net):

    Private _Organisation As String
    Public Property Organisation() As String
        Get
            Return _Organisation
        End Get
        Set(ByVal value As String)
            _Organisation = value
        End Set
    End Property
    
  • Il modello get / set viene utilizzato come pattern che fornisce una struttura che consente di aggiungere la logica durante l'impostazione o il recupero di un'istanza di proprietà di una classe istanziata, che può essere utile in vari scenari di programmazione.

  • Se questo modello è implementato ma non viene effettivamente eseguita alcuna logica nei metodi 'get' o 'set', lo schema può aggiungere codice non necessario che può costituire 'over engineering'. Non è obbligatorio che tutte le proprietà utilizzino il modello get / set
  • Una proprietà può avere solo un accesso 'get', fatto per rendere tale proprietà di sola lettura
  • Quando si implementa un modello get / set, una variabile intermedia viene utilizzata come contenitore in cui è possibile posizionare un valore e un valore estratto. La variabile intermedia è solitamente preceduta da un carattere di sottolineatura.
  • questa variabile intermedia dovrebbe essere resa privata per garantire che sia accessibile solo tramite le sue chiamate get / set e quindi più liberamente accoppiate nell'applicazione (per ulteriori dettagli, vedere la risposta a questa domanda da 'pdr)
  • La variabile intermedia è semplicemente una tecnica che deve essere utilizzata quando si implementa un modello get / set. L'impostazione di questa variabile intermedia non ha alcun effetto sulla 'protezione' della variabile attraverso diverse istanze degli oggetti- istanze di un oggetto e i loro valori di proprietà sono completamente indipendenti
risposta data 05.11.2012 - 06:11
fonte

Leggi altre domande sui tag