Passa la struttura come argomento nel metodo c #

1

Voglio sapere se è possibile passare una Struttura come parametro nel metodo c # e se possibile, è una buona pratica farlo?

Ho un metodo c # che sta prendendo sei argomenti, io davvero lo odio. Potrei creare una classe carrier per questo e passarla come argomento, ma voglio sapere se la struttura potrebbe fare il lavoro.

Voglio menzionare qui che pochi argomenti a quel metodo sono di tipo ref e pochi sono di tipo value.

    
posta MegaMind 06.12.2012 - 12:36
fonte

2 risposte

5

Sì, puoi farlo, ma devi tenere a mente un paio di cose.

Il primo è che un tipo di valore (struct) è memorizzato nello stack (spesso, non sempre, vedi thread di commenti), piuttosto che l'heap. Lo stack è di dimensioni limitate e gli oggetti di grandi dimensioni non devono essere memorizzati su di esso. Detto questo, c'è un piccolo vantaggio in termini di prestazioni per l'archiviazione delle variabili nello stack.

Il prossimo è che un tipo di valore è passato come argomento del metodo verrà copiato, piuttosto che referenziato. Questa può essere una buona cosa. Almeno sai che la tua variabile non verrà modificata dal metodo. Tuttavia, la copia viene archiviata nello stack, quindi fai attenzione. Inoltre, a volte vuoi che un metodo sia in grado di modificare i contenuti del tuo oggetto.

Infine, è necessario sapere che gli oggetti di riferimento all'interno di una struttura sono solo puntatori agli oggetti nell'heap. Quindi, se modifichi il contenuto di una di queste classi (a meno che, come una stringa, siano codificate per essere immutabili), intendi influenzare il contenuto del tuo stesso oggetto, anche se è presumibilmente immutabile. Questo può essere molto confuso.

Non appena hai detto che alcuni dei contenuti sono oggetti di riferimento, ho pensato "Mi limiterei a un corso."

Come regola generale:

  • Utilizza solo le strutture per contenere altri oggetti immutabili.
  • Utilizza solo le strutture per piccole raccolte di dati.
  • Utilizza solo le strutture in cui la modifica di un elemento al suo interno probabilmente cambierà tutte le altre.

Prendi un indirizzo come buon esempio:

  • Tutti i contenuti sono stringhe e quindi immutabili.
  • Sono solo una mezza dozzina di indicatori.
  • Anche se potresti rimanere nello stesso codice postale, ad esempio, se ti trasferisci a casa, probabilmente cambierai l'intero indirizzo.
risposta data 06.12.2012 - 12:53
fonte
1

Sì, puoi (e dovresti) avere strutture e classi come argomenti ai metodi. Ciò ti aiuterà a incapsulare i tuoi dati e renderli più facili se devi passare più dati ai tuoi metodi. Estendi semplicemente la classe e ricompila.

Ovviamente, l'estensione di una classe deve essere evitata solo se è un'interfaccia pubblica, ma se è solo interna alla tua applicazione, non dovrebbe esserci un problema.

    
risposta data 06.12.2012 - 12:45
fonte

Leggi altre domande sui tag