Para mi sistema de cuadrícula (matriz 2D), estoy creando una Index2 . Que es muy similar a un Vector2 .
Me encontré con algunos problemas que leí sobre estructuras. El encuentro con los sujetos mutables e inmutables .
Para resumir, las estructuras mutables son malas. Entonces me pregunté, ¿cómo haría que mi estructura fuera inmutable? Lo que me llevó a este post .
Si se entiende correctamente, para hacer que una estructura sea inmutable, debe asegurarse de que una vez que se crea la instancia, los miembros de la instancia no se pueden modificar.
Pero luego, cuando miro la Vector2 en la unidad. Una vez que haya creado un new Vector2(0f, 0f) , puede modificar sus valores:
Vector2 myVector = new Vector2(1f, 1f); myVector.x = 2f;Esto funciona bien.
Lo mismo con el método .Set :
Vector2 myVector = new Vector2(1f, 1f); myVector.Set(2f, 2f); También mirando la definición de un Vector , no veo ninguna de las soluciones sugeridas en la publicación vinculada anterior.
¿Qué me hace preguntarme un par de cosas?
Vector2 una estructura inmutable?Respuesta a 1: No, no es inmutable; Creo que lo demostraste tu mismo
Respuesta a 2: Bastante seguro de que su pregunta es una contradicción; uno no puede modificar un objeto inmutable
Respuesta a 3: Los objetos inmutables son geniales si tienes algo que deseas crear, úsalo una y otra vez sin modificarlo y luego listo. No son apropiados si desea crear, utilizar, modificar, utilizar de nuevo, modificar de nuevo, etc. Si tiene un escenario en el que la cosa es crear/usar-pero-no-cambiar/terminar, entonces hacer que sea inmutable es algo bueno porque SABE que no ha sido editado-detrás-de-su-espalda... se puede confiar en él como una roca en su código. Esto no es adecuado para algo que desea/necesita modificar (p. ej., la posición de la bola rodante). Por lo tanto, Vector2 es ideal para ese último caso. No se trata realmente de seguro e inseguro, sino de apropiado e inapropiado.
No es inmutable. La mayoría de las personas tienen problemas para no poder modificar componentes individuales de Vector3, hacer algo como
transform.position.x=value;esto no funcionará, pero no por la razón de la inmutabilidad. Esto no funcionará, porque transform.position no es en realidad un campo, es una propiedad (par getter setter). Casi nada de lo que expone Unity3D es setters/getters, por lo que no se define como
posición pública de Vector3;
pero como tres elementos separados, un campo de respaldo y un par de métodos que se ejecutan para recuperar o establecer el valor, entonces (llamo a mi propiedad pos no position para no confundir con la implementación real de Transform que es mucho más compleja).
private Vector3 _pos; public Vector3 pos { get { return _pos;} set { _pos=value;}}Ahora aquí está el truco. Las propiedades son esencialmente azúcar de sintaxis en C #, por lo que bajo el capó esto se compila en algo como
private Vector3 _pos; public Vector3 GetPos () { return _pos; } public void SetPos(Vector3 value) { _pos=value;}}Ahora, si observa detenidamente declaraciones como
transform.position.x+=1; // won't workNo tienen sentido, porque lo que realmente quieres decir con eso es:
Vector3 temp = transform.GetPos(); temp.x+=1; // Vectors3 mutate all right transform.SetPos(temp);Debido a que .position es una propiedad y tiene un método de respaldo, tiene que ejecutar y devolver una estructura completa, antes de que pueda modificar y enviar una nueva. Si position fuera un campo, estaría bien, pero transform no tendría forma de saber que ha cambiado y aplicar su cambio (y necesita hacer sorprendentemente muchas matemáticas si establece la posición global)