Una proprietà privata è uguale a un campo pubblico?

1

Una proprietà privata sarà uguale a un campo pubblico? Ecco il codice di esempio che ho scritto per capire questo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GetSet
{
    class Program
    {
        private int Age_private { get; set; }
        public int Age_public;
        static void Main(string[] args)
        {
            Program p = new Program();
            p.Age_public = 5;
            p.Age_private = 10;  // calling set
            int m = p.Age_public;
            int n = p.Age_private; // calling get
            Console.WriteLine(m);
            Console.WriteLine(n);
            Console.ReadLine();
        }
    }
}

Sto facendo questo correttamente?

Inoltre, segue che un campo pubblico non richiederà mai un getter and setter?

Riferimento: Quando sono generati Getter e setter

    
posta Posiedon 17.06.2015 - 13:31
fonte

3 risposte

6

Am I doing this correctly?

No. L'idea di proprietà è che la proprietà stessa è pubblica e fornisce l'accesso a campi privati. Il tuo esempio invece fa il contrario dichiarando la proprietà privata mentre il campo è esposto pubblicamente.

Come dovrebbe essere:

class Program
{
    private int Age_private;    //private field, not visible outside of class
    public int Age_public
    {      //public property to manage access to age
        get { return Age_private; }
        set
        {
            if (value == Age_private + 1)
            {
                Age_private = Age_private + 1;
            }
        }
    }
    public Program()
    {
        Age_private = 0;
    }

    static void Main(string[] args)
    {
        Program p = new Program();
        p.Age_public = 1;     //increment age using setter
        int m = p.Age_public;        //get age from getter
        Console.WriteLine(m);
        p.Age_public = 2;     //increment age again using setter
        m = p.Age_public;
        Console.WriteLine(m);
        p.Age_public = 5;     //use setter with invalid value
        m = p.Age_public;
        Console.WriteLine(m);    //age is unchanged because setter didn't change the private field
        p.Age_public = -50;     //use setter with invalid value 
        m = p.Age_public;
        Console.WriteLine(m);    //age is still unchanged because setter didn't change the private field
        Console.ReadLine();
    }
}

NON: esponi i campi al di fuori della classe

DO: fornire appropriati metodi / proprietà per accedere ai campi dove necessario

nota che il setter della proprietà ti consente di aumentare l'età di uno solo come suggerito nella risposta a cui fai riferimento. Una proprietà senza logica sarà nuovamente soggetta alla risposta a cui si fa riferimento perché espone il campo senza alcun controllo su chi interrompe l'incapsulamento.

    
risposta data 17.06.2015 - 15:53
fonte
2

Sì, questo risolve il tuo scopo ma la storia è diversa.

I campi con getter e setter sono noti come proprietà. Se non si impostano in modo esplicito getter e setter, si tratta di variabili membro o semplicemente variabili.

Quindi dì, se codi questo ...

public int a { get; set; }
private int b { get; set; }

Questi sono conosciuti come proprietà.

Oppure, queste sono note come variabili membro.

public int a;
private int b;

Inoltre, fa la stessa cosa e puoi eseguire l'assegnazione e il recupero come di seguito in entrambi i casi (a condizione che tu non stia infrangendo la logica dei modificatori di accesso).

a = 1;
b = 2;

int c = a;
int d = b;

Quindi, questo non ha nulla a che fare con l'approccio. È possibile ottenere questo con entrambi l'approccio.

Entrambi gli approcci non hanno nulla a che fare con il pubblico o il privato. Sono noti come modificatori di accesso. È possibile accedere a proprietà / variabili pubbliche da qualsiasi luogo, mentre le proprietà / variabili private sono accessibili solo all'interno del blocco definito.

Bene, allora perché sono state introdotte proprietà? Come si usa? La risposta è che sono stati introdotti per implementare l'incapsulamento.

Diciamo che hai

private int _unitprice;
private int _quantity;

public int UnitPrice
{
    get 
    { 
         return _unitprice; 
    }
    set 
    { 
        if(value > 0) _unitprice = value 
    }
}

public int Quantity
{
    get 
    { 
         return _quantity; 
    }
    set 
    { 
        if(value > 0) _quantity = value 
    }
}

public int Total
{
    get 
    { 
         return _unitprice * _quantity; 
    }
}

Supponiamo che non si desideri che gli utenti accedano direttamente ai membri privati _unitprice e _quantity, ma accedano tramite proprietà pubbliche con / senza convalida. Ho fatto alcune convalide nell'esempio sopra, ma non è obbligatorio.

E alcune altre proprietà come Quantità che non esiste dicono in tabella, ma abbiamo fornito in Business Class per fornire all'utente funzionalità e semplicità.

Inoltre, potresti notare che Total ha solo ottenuto e nessun set. Quindi puoi anche limitare l'assegnazione o il recupero usando getter e setter. Spero che questo aiuti:)

    
risposta data 17.06.2015 - 13:48
fonte
0

Il modo semplice per spiegare la tua domanda riguarda privato e pubblico; stand privati per la privacy e stand pubblici per i riflettori.

Quando dichiari un campo o un metodo privato, la tua intenzione è renderla visibile a dove si dichiara solo, al di fuori della forma o della classe è impossibile.

    
risposta data 17.06.2015 - 16:32
fonte

Leggi altre domande sui tag