Quali sono i vantaggi delle variabili di istanza locali?

2

Ho la tendenza a invocare i metodi direttamente su una nuova istanza di classe come questa:

new Person().GetAge()

quando non ho bisogno dell'istanza della classe (qui Person) dopo l'invocazione.

Tuttavia, ho visto molti sviluppatori consigliare di utilizzare questo modello:

Person p = new Person();
p.GetAge()

Quali sono i vantaggi di dichiarare una variabile locale se l'istanza a cui fa riferimento non è richiesta dopo una chiamata al metodo?

Nota: in alcuni casi, so che tali metodi possono essere modificati in metodi statici, ma per ora supponiamo che non sia possibile?

    
posta digitguy 26.09.2018 - 19:34
fonte

4 risposte

8

Se si confronta il IL prodotti per semplicemente utilizzando new Person().GetAge() versi assegnando alla variabile prima di chiamare GetAge , si noterà la iL prodotta è identica

Quindi, da quello che succede al codice, non c'è assolutamente alcuna differenza.

I benefici, o la mancanza di, risiedono quindi in altre aree. Alcuni potrebbero obiettare che assegnarlo a una variabile rende il codice più facile da leggere. Inoltre, può rendere più facile il debug.

Note: I know in some cases, such methods can be changed to static methods, but for now assume that is not possible?

Certo, possiamo assumerlo ai fini della domanda. In realtà però, direi che la creazione di un'istanza di una classe solo per invocare un metodo dovrebbe essere evitata e questa dovrebbe essere resa statica.

    
risposta data 26.09.2018 - 20:17
fonte
5

Entrambi i casi non sono l'uso appropriato degli oggetti. Un oggetto è pensato per trasportare uno stato tra le chiamate al metodo. Se si (deve) creare un oggetto per chiamare solo uno dei suoi metodi e poi scartarlo, sarebbe anche un metodo statico nella classe. Se ti capita spesso di effettuare tali chiamate, probabilmente hai bisogno di riprogettare la classe per esporre un metodo statico.

Non vedo alcun motivo per preferire sempre nessuno dei modi, a volte è più chiaro usare una variabile esplicita, a volte potrebbe distrarre da una logica più grande.

    
risposta data 26.09.2018 - 21:16
fonte
1
new Person().GetAge()

Se lo fai davvero, metto in dubbio il design della tua applicazione perché è inutile.

O dovresti passare l'istanza tramite dependency injection o dovresti semplicemente rendere l'API statica.

Non vedo assolutamente alcun vantaggio nel chiamare un metodo su un'istanza che si butta via immediatamente.

    
risposta data 27.09.2018 - 18:04
fonte
1

Per semplificare, quando usi

Person p = new Person();
p.GetAge();

crei e inizializzi un nuovo oggetto della classe Person() che puoi riutilizzare nell'intera applicazione. Facendo

new Person().GetAge()

assumiamo che ci sia un valore predefinito (una costante) che viene restituito dal metodo, che è altamente improbabile che venga usato in quel modo a meno che non sia una proprietà privata. Inoltre, questo viene immediatamente eliminato dopo l'esecuzione del codice.

Ecco una piccola implementazione della tua classe

public class Person
{
    public string Name { get; set}
    public int Age { get; set}
}

Questo ti permette di assegnare valori alle proprietà dell'oggetto, così puoi creare e dare un nome al tuo oggetto

Person p = new Person();
p.Name = "Bob Smith";

o persino un'età

p.Age = 29;

e se vuoi controllarlo o usarlo in seguito, chiamalo semplicemente:

Console.WriteLine("Name: {0}" + p.Name);
Console.WriteLine("Age: {0}" + p.Age);

Ricorda il concetto di OOP. Ecco un ottimo articolo sulla programmazione orientata agli oggetti ( C #) che può essere ottimo per te.

    
risposta data 22.10.2018 - 19:02
fonte

Leggi altre domande sui tag