Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





¿Como hacer este parámetro readonly en C#?

Iniciado por XÑA, 20 de Agosto de 2011, 11:19:29 AM

« anterior - próximo »

XÑA


public static class Helper
{
        /// <summary>White color with Alpha=1</summary>
        public static Vector4 ColorWhite = new Vector4(1, 1, 1, 1);
}




Y ahora quiero usarlo  con ref

public void Prueba(ref Vector4 v)
{
}

Y lo llamo así:

Prueba(ref Helper.ColorWhite);

Todo bien, pero claro, ¿Cómo impido que me hagan esta barbaridad?

Helper.ColorWhite.X=0;


Pues nada, poniendo readonly, pero...¡no puedo usarse con ref!  Oo

¿Cual es la solución? ;)

Vicente

Declara X como readonly si es un campo. O si es una propiedad solo dale un get pero no un set.

Mira como es la estructura Color en el framework (he puesto solo un trozo del codigo como ejemplo, el codigo de la struct es muuuuuucho mas largo)


public enum KnownColor
{
    White = 0xa4
    // Other colors declared here
}

[Serializable, StructLayout(LayoutKind.Sequential)]
public struct Color
{
    // Color value saved in a long
    private readonly long value;

    // Example of a already defined color
    public static Color White
    {
        get
        {
            return new Color(KnownColor.White);
        }
    }

    private long Value
    {
        get
        {
            // This is more complex in the framework
            return this.value;
        }
    }

    // How RGB values are handled, no set!
    public byte R
    {
        get
        {
            return (byte)((this.Value >> 0x10) & 0xffL);
        }
    }
}


Lo mas interesante que tiene es que Color es inmutable. Una vez creas una estructura del tipo Color, es imposible modificar sus valores, simplemente porque no hay nada publico que te permita modificarlos. En general, las estructuras en .NET deberian diseñarse siguiendo esta idea, una vez se crean, no se pueden cambiar.

XÑA

Me dice lo mismo:

public static Vector4 ColorWhite { get { return new Vector4(1, 1, 1, 1); } }

Error   1   Una propiedad, un indizador o un acceso de miembro dinámico no se pueden pasar como parámetro out o ref.

Vicente

Guarda el resultado de ColorWhite en una variable y pasa la variable por ref.

XÑA

        static Vector4 colorWhite = new Vector4(1, 1, 1, 1);

        /// <summary>White color with Alpha=1</summary>
        public static Vector4 ColorWhite { get { return colorWhite; } }

El mismo problema...  ???

Vicente

Me referia a algo asi :)

Vector4 miVector = Vector.ColorWhite;
Mifuncion(ref miVector);

XÑA

Es que eso es lo que quiero evitar. Porqué hace un copy de 16 bytes y entonces no tiene sentido pasarlo por ref, puesto que sólo quiero pasarlo por ref para evitarme ese copy...






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.