Exportar (0) Imprimir
Expandir todo

Tipos de valores definidos por el usuario

Visual Studio 2005

Un tipo de valor es similar a una clase, sólo que en lugar de ser una referencia a un objeto en el montón, un tipo de valor es un agregado que se puede crear directamente en la pila, como un tipo primitivo. Pero, al igual que las clases, los tipos de valor pueden tener constructores, constantes, campos, métodos, propiedades y tipos anidados como miembros. Sin embargo, las restricciones siguientes son aplicables cuando se define un tipo de valor:

  • Los tipos de valor deben extender ValueType.

  • Los tipos de valor deben declararse de manera explícita final.

  • Los tipos de valor no pueden declararse abstract.

  • Los miembros de la clase pueden declararse public y private, pero no protected. Si no se especifica, el acceso es package scoped.

  • No se puede declarar un constructor sin parámetros en tipos de valor.

  • No se permiten inicializadores de campo en los campos de instancia de tipos de valor. Sin embargo, los campos estáticos pueden tener inicializadores de campo.

  • Es un error que el constructor de un tipo de valor definido por el usuario llame a super.

  • Los tipos de valor no pueden declarar un método finalize.

  • Los tipos de valor no admiten la reflexión de Java y no se pueden serializar como tipos de Java. Utilice la reflexión y la serialización de .NET Framework con estos tipos.

  • Los tipos de valor no están disponibles con la opción /x:net.

Se pueden crear instancias de los tipos de valor de dos maneras. Puede crear instancias de un tipo de valor de forma inicializada o no inicializada mediante el operador new. Aunque se llama al operador new, el objeto de tipo de valor se asigna en la pila, no en el montón. El período de duración del objeto es el período de duración del marco de pila en el que se crea. Cuando el ámbito en el que se declara queda fuera de ámbito, el objeto se destruye.

En el ejemplo siguiente se muestra la definición y creación de instancias de un tipo de valor simple.

// value_type.jsl
public final class Point extends System.ValueType
{
    public int x;
    public int y;
}
class CMain
{
    public static void main()
    {
        Point p = new Point();
        p.x = 5;
        p.y = 10;
        System.Console.WriteLine("Point [x,y] = " + p.x + ", " + p.y);
    }
}

Point [x,y] = 5, 10

Si un tipo de valor no está asignado ni inicializado con el operador new, se considera no inicializado.

Un tipo de valor tiene un valor predeterminado que se utiliza en ciertos contextos, como cuando se crea una matriz de tipos de valor. El valor predeterminado es el valor que se genera al establecer todos los campos de tipo de valor en sus valores predeterminados y los tipos de referencia en null. Por ejemplo, los tipos enteros primitivos tienen un valor predeterminado de 0, por lo que en el código siguiente, los miembros del punto x e y se establecerán en cero en todos los objetos de la matriz:

Point[] pa = new Point[100];

Dado que cada tipo de valor tiene un constructor sin parámetros definido implícitamente que genera el valor predeterminado como se describe, es un error declarar un constructor sin parámetros en un tipo de valor.

Los tipos de valor pueden hacer referencia a los miembros heredados de ValueType.

Los tipos de valor definidos por el usuario tienen semántica de valores, pero no tienen semántica de referencias. Con los tipos de referencia, es posible tener dos referencias al mismo objeto. Con los tipos de valor, cada instancia contiene su propia copia de los datos. Cuando se asigna un tipo de valor, se copian los datos. Cuando se asigna un tipo de referencia, sólo se copia la referencia. De este modo, para los tipos de referencia, es posible que las operaciones afecten a una instancia compartida por dos referencias. Esto no es posible para los tipos de valor, que siempre funcionan en su propia instancia única.

De forma similar, cuando un tipo de valor se pasa como argumento a una función, la función creará su propia copia del objeto, a menos que la función utilice la etiqueta Definir métodos que toman argumentos por referencia para especificar que toma el parámetro por referencia.

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft