C'è qualcosa di sbagliato nel rendere il nullability di un tipo di riferimento esplicito avvolgendolo in un tipo di valore?

2

Quando programma in Java, rendo esplicito tutto il nullability; cioè, si presume che un'istanza di Foo sia non nulla, e se voglio che sia nullo, io uso un'annotazione @Nullable (o meglio, Optional<Foo> ). Ma C # non supporta nativamente le annotazioni e Nullable < > è solo per i tipi di valore.

Ma cosa succede se ho fatto qualcosa di simile?

struct Value<T> where T : class {
  T value;
}

E quindi usa Value<Foo>? come tipo per un campo. Che impatto avrebbe avuto sulle prestazioni / memoria, e c'è qualcosa che rende questa idea pessima?

    
posta Nick Tobey 05.11.2017 - 01:22
fonte

3 risposte

9

I riferimenti sono già passati per valore in .net. E poiché value può essere nullo, non stai guadagnando molto. Non è nemmeno possibile forzare un simpatico costruttore per garantire che il valore non sia nullo poiché le strutture richiedono un costruttore nullo pubblico.

Stai lavorando per guadagnare nient'altro che confusione.

    
risposta data 05.11.2017 - 01:41
fonte
1

Ci sono alcune implementazioni di C # Option / Maybe : qui , qui o qui

C'è anche una proposta per fare riferimenti non annullabili in C # , nel qual caso ci sarà bisogno per qualche tipo di tipo Nullable / Option per i tipi di riferimento.

Quindi la tua idea è perfettamente valida e supportata da molte persone. Solo la tua implementazione non è eccezionale. Non è necessario racchiudere un riferimento nella struttura e quindi utilizzare Nullable . Fai in modo che la struttura si comporti come Nullable . Che cosa fanno tutte le altre implementazioni.

Per quanto riguarda le prestazioni, non mi preoccuperei troppo. Le migliori prestazioni sono spesso ottenute utilizzando strutture e algoritmi migliori e non ottimizzando i tuoi tipi. E qualsiasi risultato in termini di prestazioni verrà soppesato migliorando la stabilità e la leggibilità del codice, a causa della gestione esplicita degli stati null .

    
risposta data 05.11.2017 - 07:08
fonte
0

Sembra che stai reinventando le ruote lì - perché non puoi semplicemente usare T? come tipo di valore nullable? Immagino sotto le coperte esattamente quello che stai suggerendo sta già accadendo. Dato che il nullable è definito esplicitamente nella definizione del tipo usando il?, Allora hai già quello che vuoi.

Per quanto riguarda i tipi che sono già annullabili, direi che rendere un tipo generico nullable che può contenere un null per essere un'idea particolarmente negativa solo perché confonderà le persone, aggiungerà molto codice extra e non fornirà alcun vantaggio.

Se devi davvero avere un'annotazione, usa una convenzione di denominazione.

    
risposta data 05.11.2017 - 01:29
fonte

Leggi altre domande sui tag