Usa struct oppure no

2

Ho creato un piccolo wrapper per le affermazioni di precondizione fluenti in c #.

Ora fondamentalmente in tutti i metodi pubblici / contrattuali asserisco i valori in questo modo:

Precondition
            .For(()=>Model)
            .NotNull();

Precondition crea un'Istanza ValidationRule su cui dispongo dei metodi di convalida specificati.

Ora questo accade molto spesso e penso che usare una struct potrebbe essere un vantaggio, anche perché ValidationRule ha solo valori, non ci sarà affatto boxing, è sigillato per definizione ed è immutabile. Inoltre, non vengono utilizzati come parametri o eventi al di fuori dell'ambito dei metodi di chiamata.

Ma il contrario è che ha più valori e lì non per quel piccolo ingombro.

Il ValidationRule ha un aspetto sostanzialmente simile a questo:

 public sealed class ValidationRule<T>
    {
        public T Value { get; }

        public string Name { get; }

        public string File { get; }

        public string Source { get; }

        public int Line { get; }

        public ValidationRule(T value, string name, string file, string source, int line)
        {
            Value = value;
            Name = name;
            File = file;
            Source = source;
            Line = line;
        }

        public ValidationRule<T> NotNull()
        {
            if (Value == null)
            {
                throw new ArgumentNullException(Name, "Value must not be null!");
            }
            return this;
        }

        public ValidationRule<T> NotDefault()
        {
            T val = default(T);
            if (Value.Equals(val))
            {
                throw new ArgumentException(Name, "Value must have default value!");
            }
            return this;
        }

Quindi strutturare o no? E il più importante perché?

    
posta Boas Enkler 16.02.2017 - 14:25
fonte

1 risposta

3

✓ CONSIDER defining a struct instead of a class if instances of the type are small and commonly short-lived or are commonly embedded in other objects.

X AVOID defining a struct unless the type has all of the following characteristics: It logically represents a single value, similar to primitive types (int, double, etc.). It has an instance size under 16 bytes. It is immutable. It will not have to be boxed frequently.

In all other cases, you should define your types as classes.

MSDN: scelta tra struct e class

La tua classe è di 20 byte (supponendo che tu aggiunga un filtro where class a T ), quindi è la giusta dimensione, ma non c'è un'istanza predefinita che avrebbe senso. Lo hai implementato immutabilmente (per quanto ne so), quindi potrebbe essere una struttura.

Quindi in realtà si riduce a ciò che T può essere e se si prevede o meno di ottenere un boxed e unboxed molto. Se T può essere un tipo di valore o sarà molto affollato, segui una classe. Altrimenti ... continui a seguire una lezione. Struct dovrebbe davvero rappresentare valori semplici.

    
risposta data 17.02.2017 - 11:38
fonte

Leggi altre domande sui tag