Como sabemos, en C# las estructuras se pasan por valor, no por referencia. Así que si tengo una estructura con los siguientes miembros de datos:C# struct con el objeto como miembro de datos
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 ...
}
Así que cuando un cuadro de mensaje se pasa como un parámetro, se hace una copia en la pila, ¿verdad? ¿Qué significa eso en términos de cómo se copian los miembros de los datos? Los dos primeros son tipos de estructura, por lo que las copias deben hacerse de DateTime y TimeSpan. El tercer tipo es un primitivo, por lo que también se copia. Pero, ¿qué pasa con dm_strMessage, que es una referencia a un objeto? Cuando se copia, se crea otra referencia a la misma Cadena, ¿verdad? El objeto en sí reside en el montón, y NO se copia (solo hay una instancia del mismo en el montón). Ahora tenemos referencias al mismo objeto de tipo Cadena. Si se accede a las dos referencias desde diferentes hilos, es concebible que el objeto String podría corromperse al ser modificado desde dos direcciones diferentes simultáneamente. La documentación de MSDN dice que System.String es seguro para subprocesos. ¿Eso significa que la clase String tiene un mecanismo incorporado para evitar que un objeto se corrompa exactamente en el tipo de situación descrita aquí? Estoy tratando de averiguar si mi estructura de MessageBox tiene posibles fallas/trampas que son una estructura vs. una clase. Gracias por cualquier entrada.
Source.Energy.
Aquí hay una pregunta similar con la respuesta de Jon Skeet al final http://bytes.com/topic/c-sharp/answers/553351-what-happens-reference-type-valuetype-struct –