Las otras respuestas han respondido correctamente a su pregunta principal: que el valor de un propiedad de tipo de referencia es una referencia a un ejemplo del tipo de referencia.
La pregunta más importante es "¿ahora qué haces al respecto?" Presumiblemente usted hace no quiere código que puede obtener la lista para poder cambiar él.
Aquí hay varias opciones.
En primer lugar, haga lo que haga, le recomiendo que deje de usar ArrayList en este momento y empiece a usar un tipo más moderno y seguro para almacenar una lista de cosas. List<string>
viene inmediatamente a la mente.
En segundo lugar, ¿es necesario que el setter de la propiedad sea público? ¿Quieres que cualquiera pueda cambiar esa lista? ¿O debería el tipo en sí mismo ser responsable de actualizarlo de alguna manera? Consideraría hacer el setter privado.
En tercer lugar, tenemos una sintaxis más compacta para una propiedad "trivial".Usted podría estar diciendo
public List<string> SpillageListDescriptions { get; private set; }
y el compilador generará el campo de respaldo para usted.
Tenga en cuenta que List<string>
aún permite la mutación.
Si todo lo que el cliente le importa es ser capaz de iterar sobre la lista de una cosa a la vez, entonces usted puede hacer esto:
private List<string> descriptions = whatever;
public IEnumerable<string> SpillageListDescriptions
{
get
{
if (descriptions == null) yield break;
foreach(var description in descriptions)
yield return description;
}
}
y ahora es imposible para la persona que llama para mutar la lista, porque todo lo que les das es un iterador sobre él, no acceso a la lista en sí.
O usted podría hacer:
private List<string> descriptions = whatever;
public IList<string> SpillageListDescriptions
{
get
{
return new ReadOnlyCollection<string>(descriptions);
}
}
Y ahora la persona que llama tiene una vista de sólo lectura de la lista que va a lanzar una excepción si intentan modificarlo.
Piense en ello como C++, puede pasar un puntero a un objeto, y puede modificar a qué apunta ese puntero, pero no puede hacer que apunte a otra cosa porque tiene una copia del puntero y no del puntero original . Si desea cambiar a qué objeto apunta, debe pasar un puntero a un puntero (o una referencia a un puntero). Esta es la razón por la cual en C# necesita las palabras clave ref y out si quiere alterar a qué objeto se hace referencia. –
Excelente: tiene perfecto sentido –