El objeto de sesión cambia cuando el objeto se actualiza en C #

Tengo este problema realmente extraño y estoy seguro de que me estoy perdiendo algo obvio aquí. Tengo estas dos líneas:

HttpContext.Current.Session[listModelType + "ListModel"] = listModel; listModel.ProductRows = new Collection(listModel.ProductRows.Where(r => r.ParentRowId == 0).ToList()); 

Después de ejecutar la segunda línea, mi objeto de sesión también se actualiza (de acuerdo con “Ver” en Visual Studio)

¿Que me estoy perdiendo aqui?

Yo he tratado

 int i = 0; HttpContext.Current.Session["i"] = i; i++; 

y HttpContext.Current.Session [“i”] permanece en 0.

Ver tipos de valor y tipos de referencia .

El int es un tipo de valor por lo que se almacenará “tal cual” en el momento de la asignación; your listModel es un tipo de referencia, por lo que almacena una referencia al objeto en su sesión, no al valor del objeto.

Tendrá que crear una nueva instancia de listModel si desea que la de su sesión permanezca intacta.

En su primer ejemplo, está almacenando una referencia al objeto (la ubicación de la memoria de las listas). Así que si la list se actualiza se reflejará en la sesión. Este es un tipo de referencia.

En el segundo ejemplo, está utilizando un tipo de valor:

 int i = 0; HttpContext.Current.Session["i"] = i; i++; 

Usted declara i y lo pone a 0 (tipo de valor)

Almacenas el valor 0 en la sesión. (No es la ubicación de memoria de i )

Incrementas i pero la sesión todavía tiene el valor 0

En el primer ejemplo, su variable de sesión apunta a una reference por lo que se actualiza porque las dos referencias apuntan al mismo valor.

La segunda variable de sesión apunta a un tipo primitive (value) para que tengan copias de valor separadas.

En el primer ejemplo, su variable de sesión apunta a una referencia, por lo que se actualiza porque las dos referencias apuntan al mismo valor.

así que antes de asignar a la sesión lo conviertes en Json y luego asignas

 HttpContext.Current.Session[listModelType + "ListModel"] = JsonConvert.SerializeObject(listModel); 

Nota: JsonConvert es del espacio de nombres Newtonsoft.Json espacio de nombres en c #

En la segunda línea si el valor cambia en el objeto listModel que no refleja la sesión. pero cuando desee recuperar el valor de la sesión, debe convertirlo a la forma objeto Json

 if (HttpContext.Current.Session[listModelType + "ListModel"] != null) { listModel = JsonConvert.DeserializeObject<*CLASS name of lsitmodel*>((string)HttpContext.Current.Session[listModelType + "ListModel"]); } 

La forma correcta debe ser:

  int i = 0; i++; HttpContext.Current.Session["i"] = i; 

la HttpContext.Current.Session [“i”] sigue siendo 1.

En el primer ejemplo, su variable de sesión apunta a una referencia, por lo que se actualiza porque las dos referencias apuntan al mismo valor.

así que antes de asignar a la sesión lo conviertes en Json y luego asignas

  HttpContext.Current.Session[listModelType + "ListModel"] = JsonConvert.SerializeObject(listModel); 

Nota: JsonConvert es del espacio de nombres Newtonsoft.Json espacio de nombres en c #

En la segunda línea si el valor cambia en el objeto listModel que no refleja la sesión. pero cuando desee recuperar el valor de la sesión, debe convertirlo a la forma objeto Json

  if (HttpContext.Current.Session[listModelType + "ListModel"] != null) { listModel = JsonConvert.DeserializeObject<*CLASS name of lsitmodel*>((string)HttpContext.Current.Session[listModelType + "ListModel"]); }