Valor de diccionario de C # borrado cuando borro la lista previamente asignada … ¿por qué?

Dictionary <string, List > saleItemNew = new Dictionary<string, List> (); saleItems = new List  (); saleItemNew.Add("1", saleItems); 

En este punto, la lista del diccionario tiene valores.

 saleItems.Clear(); 

Sin embargo, cuando elimino la lista asignada anteriormente, la lista de valores del diccionario ahora está vacía … ¿por qué?

El diccionario contiene la misma referencia a la lista, por lo que modificar la lista cambiará ambas referencias.

Documentación de Microsoft sobre tipos de referencia: http://msdn.microsoft.com/en-us/library/490f96s2.aspx

La razón es que el diccionario es una referencia y no un tipo de valor. Cuando asigna un diccionario a otra variable, no realiza una copia profunda. En su lugar, solo señala otra referencia en el mismo objeto. Como solo hay un objeto, la limpieza a través de cualquiera de las referencias será visible para ambas referencias.

Esto en contraste con los tipos de valores en .Net Framework. La asignación de un tipo de valor esencialmente realiza una copia superficial de los datos y crea dos objetos independientes. Tenga en cuenta que si el tipo de valor tiene un campo de referencia, los dos campos en los dos tipos de valores seguirán apuntando al mismo objeto.

tiene que ver con el uso de la memoria y los punteros. Tiene una stack y un montón cuando asigna memoria para objetos, esa memoria es una stack. Su variable saleItems se define en la stack y apunta a la dirección de memoria en el montón. Tu diccionario también está en la stack apuntando al montón.

cuando tu dices:

 saleItems = new List() 

la variable saleItems se inserta en la stack y contiene una dirección de memoria de los puntos a la ubicación de los datos en el montón. Digamos que 0x0100 . Ahora agrega un nuevo DictionaryItem a su diccionario. El DictionaryItem se coloca en el montón con dos propiedades, Clave y Valor. En este caso, ha agregado elementos de saleItems como Value , por lo que Value tiene la dirección 0x0100 . Ahora DictionaryItem.Value apunta a la misma memoria que saleItems. Cuando llamas a saleItems.Clear, dices que encuentras la lista en la dirección 0x0100 y quitas todos los artículos. Entonces el diccionario y la variable se vuelven vacíos porque apuntan a la misma memoria. Lo que quiere hacer es decir saleItems = new List(); de nuevo. Ahora saleItems señalará una nueva dirección en el montón (digamos 0x0200 ). DictionaryItem.Value aún apunta a la dirección de memoria 0x0100 para que pueda actuar en la variable saleItems sin afectar los datos de su diccionario.

Para obtener más información sobre stacks y montones en c #, pruebe este artículo: http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspx?ArticleID=9adb0e3c-b3f6-40b5-98b5-413b6d348b91

Agregar la Lista al diccionario es solo una copia superficial … No se crea ni agrega una nueva lista con los mismos valores (una copia profunda); más bien se agrega una referencia a la lista anterior.

Utiliza la misma referencia.

Una mejor manera de hacerlo es

 Dictionary > saleItemNew = new Dictionary>(); saleItemNew.Add("1", new List()); 

Y para limpiar

 saleItemNew["1"] = new List(); 

Como es un tipo de referencia, solo se copia el puntero a los valores en la memoria, no los valores en sí mismos. Puede especificar el comportamiento que desea con un constructor:

Desde punto net perls: // // Copie el diccionario a un segundo objeto. // Diccionario copy = new Dictionary (dictionary);