Come sappiamo, in C# le strutture vengono passate per valore, non per riferimento. Quindi, se ho una struct con i seguenti membri di dati:C# struct con oggetto come membro dati
private struct MessageBox
{
// data members
private DateTime dm_DateTimeStamp; // a struct type
private TimeSpan dm_TimeSpanInterval; // also a struct
private ulong dm_MessageID; // System.Int64 type, struct
private String dm_strMessage; // an object (hence a reference is stored here)
// more methods, properties, etc ...
}
Così, quando un MessageBox viene passata come parametro, viene fatta una copia in pila, giusto? Che cosa significa in termini di come vengono copiati i membri dei dati? I primi due sono tipi di struct, quindi le copie dovrebbero essere fatte di DateTime e TimeSpan. Il terzo tipo è un primitivo, quindi è anche copiato. Ma per quanto riguarda dm_strMessage, che è un riferimento a un oggetto? Quando viene copiato, viene creato un altro riferimento alla stessa stringa, giusto? L'oggetto stesso risiede nell'heap e NON è copiato (ne esiste solo una nell'archivio.) Quindi ora dobbiamo fare riferimento allo stesso oggetto di tipo String. Se si accede ai due riferimenti da thread diversi, è concepibile che l'oggetto String possa essere corrotto modificando contemporaneamente da due direzioni diverse. La documentazione MSDN dice che System.String è thread-safe. Significa che la classe String ha un meccanismo integrato per impedire che un oggetto venga corrotto esattamente nel tipo di situazione qui descritta? Sto cercando di capire se la mia struttura MessageBox ha potenziali difetti/insidie essere una struttura rispetto a una classe. Grazie per qualsiasi input.
Source.Energy.
Ecco una domanda simile con la risposta di Jon Skeet alla fine http://bytes.com/topic/c-sharp/answers/553351-what-happens-reference-type-valuetype-struct –