Strutture e campi nudi faciliteranno l'interoperabilità con alcune API non gestite. Spesso troverai che l'API di basso livello vuole accedere ai valori per riferimento, il che è buono per le prestazioni (poiché evitiamo una copia non necessaria). L'uso delle proprietà è un ostacolo a ciò, e spesso le librerie wrapper eseguono copie per facilità d'uso e talvolta per sicurezza.
Per questo motivo, otterrai spesso prestazioni migliori con tipi di vettori e matrici che non hanno proprietà ma campi nudi.
Le migliori pratiche non stanno creando nel vaccum. Nonostante un po 'di culto delle merci, in genere le migliori pratiche esistono per una buona ragione.
In questo caso, ne abbiamo un paio:
Una proprietà consente di modificare l'implementazione senza modificare il codice client (a livello binario, è possibile modificare un campo in una proprietà senza modificare il codice client a livello di origine, tuttavia verrà compilato in qualcosa di diverso dopo la modifica) . Ciò significa che usando una proprietà dall'inizio, il codice che fa riferimento al tuo non dovrà essere ricompilato solo per cambiare ciò che la proprietà fa internamente.
Se non tutti i possibili valori dei campi del tipo sono stati validi, non si desidera esporli al codice client che il codice lo modifica. Pertanto, se alcune combinazioni di valori non sono valide, si desidera mantenere i campi privati (o interni).
Ho detto il codice client. Ciò significa che il codice che chiama nel tuo. Se non stai creando una libreria (o addirittura non stai creando una libreria ma usi interni invece di pubblici), di solito puoi cavartela e avere una buona disciplina. In quella situazione, la migliore pratica di usare le proprietà è lì per impedirti di spararti nel piede. Inoltre, è molto più facile ragionare sul codice se puoi vedere tutti i luoghi in cui un campo può cambiare in un singolo file, invece di doverti preoccupare di qualunque cosa venga modificata da qualche altra parte. In effetti, le proprietà sono anche buone per mettere dei punti di interruzione quando si capisce cosa è andato storto.
Sì, c'è valore è vedere cosa si sta facendo nell'industria. Tuttavia, hai una motivazione per andare contro le migliori pratiche? o stai solo andando contro le migliori pratiche - rendendo il codice più difficile da ragionare - solo perché lo ha fatto qualcun altro? Ah, a proposito, "altri lo fanno" è il modo in cui inizi un culto del carico.
Quindi ... Il tuo gioco è lento? È meglio dedicare tempo a capire il collo di bottiglia e risolverlo, invece di speculare su cosa potrebbe essere. Puoi stare certo che il compilatore farà molte ottimizzazioni, per questo motivo è probabile che tu stia esaminando il problema sbagliato.
Il rovescio della medaglia, se stai decidendo cosa fare per cominciare, dovresti preoccuparti di quali algoritmi e strutture dati prima, invece di preoccuparti di dettagli più piccoli come campi vs proprietà.
Infine, guadagni qualcosa andando contro le migliori pratiche?
Per i dettagli del tuo caso (Unity e Mono per Android), Unity assume valori come riferimento? In caso contrario, copierà comunque i valori, senza alcun guadagno in termini di prestazioni.
In tal caso, se si stanno passando questi dati a un'API che accetta ref. Ha senso rendere pubblico il campo o potresti rendere il tipo in grado di chiamare direttamente l'API?
Sì, certo, ci potrebbero essere delle ottimizzazioni che potresti fare usando le strutture con campi nudi. Ad esempio, puoi accedervi con i puntatori Span<T>
o simili. Sono anche compatti in memoria, il che li rende facili da serializzare per l'invio in rete o l'archiviazione permanente (e sì, quelli sono copie).
Ora, hai scelto gli algoritmi e le strutture giuste, se si rivelano un collo di bottiglia, quindi decidi qual è il modo migliore per risolverlo ... che potrebbe essere strutture con campi nudi o no. Sarai in grado di preoccuparti di questo se e quando accadrà. Nel frattempo puoi preoccuparti di questioni più importanti come fare un gioco buono o divertente che valga la pena giocare.