2010-09-17 15 views
5

attualmente sto pensando all'incapsulamento dei dati in C# e sono un po 'confuso. Anni fa, quando ho iniziato a imparare programmazione con C++, il mio professore mi ha detto: - "Creare una classe e nasconderlo membri di dati, in modo che non può essere manipolata direttamente dall'esterno"Incapsulamento dei dati in C# utilizzando le proprietà

Esempio: Sei analizzando un file XML e memorizzando i dati analizzati in alcuni membri di dati all'interno della classe parser.

Ora, quando guardo C#. Hai lì le proprietà. Questa funzione rende visibili allo stato interno/interno di una classe. Non c'è più incapsulamento. Destra?

private string _mystring; 
public string MyString 
{ 
    get {return _mystring;} 
    set {_mystring = value;} 
} 

Dal mio punto di vista non v'è alcuna differenza tra fare i membri di dati pubblica o che hanno proprietà pubbliche, che hanno getter e setter, dove si passa il membri di dati privati ​​attraverso.

Qualcuno può spiegarmi che per favore?

Grazie

risposta

13

I dati privati ​​sono incapsulati dalla proprietà stessa. L'unico modo per accedere ai dati è attraverso la proprietà.

Nella tua situazione sopra, ci sono pochi motivi per usare la proprietà. Tuttavia, se in seguito bisogno di aggiungere un po 'di convalida, è possibile, senza rompere l'API, cioè ::

private string _mystring; 
public string MyString 
{ 
    get {return _mystring;} 
    set 
    { 
     if (IsAcceptableInput(value)) 
     _mystring = value; 
    } 
} 

ricordare che una proprietà, in .NET, è in realtà solo una sintassi più pulito per 2 metodi - un metodo per la sezione get della proprietà e una per la sezione set di proprietà. Fornisce tutto lo stesso incapsulamento di una coppia di metodi in C++, ma una sintassi (probabilmente discutibile) per l'uso.

+0

Grazie mille. Questo ha chiarito alcune cose. – Ferhat

0

Il vantaggio di proprietà è che in seguito, si potrebbe decidere di aggiungere la convalida ecc per il metodo setter, o fare il metodo getter fare qualche calcolo o caching, e nessuno di codice che chiama già la vostra la proprietà dovrebbe cambiare, poiché l'interfaccia di classe è rimasta stabile

1

C'è ancora l'incapsulamento dei dati, se ne hai bisogno. Incapsulare i dati non significa nasconderlo dal client della classe o renderlo inaccessibile, significa garantire un'interfaccia coerente e uno stato di oggetto interno.

Diciamo che si dispone di un oggetto che rappresenta una macchina di spostamento del bastone e una proprietà per impostare la velocità. Probabilmente sai che dovresti cambiare marcia tra gli intervalli di velocità, quindi è qui che entra in gioco l'incapsulamento.

Invece di rendere pubblica la proprietà, consentendo così l'accesso pubblico senza alcuna verifica, puoi usare getter e setter di proprietà in C#:

class StickShiftCar : Car 
{ 
    public int MilesPerHour 
    { 
     get {return this._milesPerHour;} 

     set 
     { 
      if (vaule < 20) 
       this._gearPosition = 1; 
      else if (value > 30) 
       this._gearPosition = 2; 
      ... 
      ... 
      this._milesPerHour = value; 
    } 
} 

Anche se questo esempio non è necessariamente compilabile, sono sicuro che tu mi prenda in considerazione.

2

Bene, così le proprietà non sono il selvaggio west che state facendo per essere a prima vista. La sfortunata verità di OOP è che molti dei tuoi metodi sono getter e setter e le proprietà sono solo un modo per semplificare la scrittura. Inoltre controlli ciò che desideri che la proprietà permetta a qualcuno di fare.È possibile effettuare una proprietà leggibile ma non scrivibile, in questo modo:

private string _mystring; 
public string MyString 
{ 
    get {return _mystring;} 
} 

O come detto da Reed si può avere il metodo set fare una trasformazione o il controllo di qualsiasi quantità di complessità. Per esempio qualcosa come

private long myPrime; 
public long Prime { 
    get { return myPrime; } 
    set { 
    if (prime(value) { 
     myPrime = prime; 
    } 
    else { 
     //throw an error or do nothing 
    } 
    } 
} 

È in genere hanno tutto il valore che si ottiene da incapsulamento, con un po 'di zucchero sintattico per fare alcune attività comuni più facile. Puoi fare le stesse cose che fanno le proprietà in altre lingue, sembra solo diverso.

+1

+1 Stavo solo scrivendo la stessa cosa :) – skajfes

0

Guardando un po 'più in profondità, perché il tuo professore ti ha detto di incapsulare? Solo perché è il giusto design orientato agli oggetti? Perché è il modo giusto? Linguaggi di programmazione e paradigmi sono solo un modo per far fronte alla complessità di ottenere un processore per eseguire il nostro codice in un modo comprensibile. Ci sono due lettori di codice, la macchina e gli umani. La macchina caricherà felicemente i dati da o verso qualsiasi indirizzo nello spazio di memoria. Noi umani invece amiamo pensare alle "cose". Il nostro cervello si occupa di "cose" che hanno attributi o che svolgono azioni. Un leone ti mangerà, una lancia può difenderti, un leone è peloso, una lancia è a punta. Quindi possiamo capire i programmi se sono modellati come "cose". Le proprietà dovrebbero modellare gli attributi di una cosa e i metodi dovrebbero modellare le azioni delle cose. In pratica può diventare piuttosto confuso e tutto non può essere modellato come un'azione del mondo reale, ma lo sforzo per farlo, se fatto bene, può rendere un programma comprensibile.

0

si può mancare il fatto che non si deve avere di immobili da corrispondere a tutti i campi membro della classe. Puoi decidere quali proprietà aggiungere alla tua classe e se saranno accessibili al di fuori della classe.

0

Il primo tentativo di utilizzo di immobili per incapsulare il valore è ottenere; set; Ma C# fornisce funzionalità più avanzate per arricchire le funzioni all'interno di get e set per rendere la proprietà di sola lettura, di sola scrittura o con determinate condizioni. Ad esempio, per impostare il valore come

private string temp; 
public string temp 
{ 
    get 
    { 
     return temp; 
    } 
} 

sarà meglio che usare:

public readonly string Temp; 
Problemi correlati