2010-11-12 7 views
5

les extiendo algunos de los tipos de datos básicos en vb.net para una aplicación de gran tamaño. Esto incluye integer, string, short, etc. Tal como está, mis nuevos objetos de tipo de datos tienen nombres como MYInteger y MYString. Dado que estos son los únicos tipos que estoy usando para mi aplicación y en su mayoría son compatibles con los tipos por defecto, ¿hay alguna manera de reemplazar los valores predeterminados con el mío así que cuando Dim iThing as Integer que en realidad estás usando mi tipo entero ligeramente a medida?¿Cómo puedo anular tipos básicos como entero, cadena, etc.?

+2

¿Hay alguna razón por la que tenga que usar nuevos tipos primitivos? ¿Por qué no podrías usar los métodos de extensión? – cdhowie

+1

Creo que rompe casi todas las reglas de programación. Sin embargo, tampoco creo que sea posible. En general, parece un buen candidato para los métodos de extensión. – Inisheer

+2

Primero compruebe si el programa de protección de testigos del FBI también es accesible para los programadores que han renunciado recientemente a su trabajo. –

Respuesta

8

No. Si pudiera, imagine el caos que podría causar. Habría dos posibilidades en este escenario:

  1. Todo el código se ejecuta en el mismo proceso utilizaría esos tipos, incluso el código que no se lo esperaba. Malo.

  2. Su concepto de Integer es diferente del concepto de CLR de Integer, y de repente dos objetos del mismo tipo son diferentes. Malo.

Usted puede añadir métodos de extensión para tipos sellados. Algo así como:

Module MyExtensions 
    <Extension()> 
    Public Function Extended(i as Integer) As Integer 
     return i + 4 
    End Function 
End Module 

4.Extended() ' evaluates to 8 
1

No estoy seguro de si realmente quieres hacer eso. Hará que sea más difícil de mantener en el futuro. ¿Por qué no simplemente usar MyInteger, etc. Si va a importar código fuente externa, acaba de hacer un descubrimiento & reemplazar.

+1

Tenía miedo de no poder hacer eso. Es principalmente porque el código en cuestión va a ser trabajado por mucha gente y ya hemos tenido problemas con algunas personas que usan números enteros normales y algunas que usan el tipo personalizado y luego un montón de caos. Algunas funciones están escritas para usar las predeterminadas y otras como personalizadas y estaba buscando simplificar las cosas. – DynamiteReed

2

No sé si se aplica en su caso, pero a veces la gente quiere hacer lo que equivale a escalar "especializado"/tipos primitivos.

Por ejemplo, vea algunos de los tipos definidos en this codeplex project. Algunos de los tipos incluyen Latitud, Longitud, ángulo, etc. Cada uno de estos tipos es en realidad una estructura con un único elemento de datos, por lo general un doble, float, o int/larga, tales como este:

public struct Latitude : IFormattable, IComparable<Latitude>, IEquatable<Latitude> 
{ 
    private readonly double _DecimalDegrees; 

    //Some constants 

    //Some constructors 

    //Some static fields like... 
    public static readonly Latitude Equator = new Latitude(0.0); 
    public static readonly Latitude TropicOfCapricorn = new Latitude(-23.5); 
    public static readonly Latitude TropicOfCander = new Latitude(23.5); 

    //Some operators 
    public static Latitude operator +(Latitude left, Latitude right) 
    { 
    return new Latitude(left.DecimalDegrees + right.DecimalDegrees); 
    } 

    public static Latitude operator +(Latitude left, double right) 
    { 
    return new Latitude(left.DecimalDegrees + right); 
    } 
} 

Técnicamente , estos tipos son sólo clase o estructuras (principalmente structs en el caso del proyecto vinculado), sino que se utilizan para representar los valores que son a menudo (por lo general casi siempre ?, ??) los valores simplemente escalares. Si tiene un objeto que tiene una propiedad Ángulo, la mayoría de la gente probablemente lo haga doble.

public MyObject 
{ 
    public double AngleInDegrees { set; get; } 
} 

Cuando se asigna un valor a AngleInDegrees, MiObjeto podría querer hacer algo de procesamiento:

public double AngleInDegrees 
{ 
    get 
    { 
    return _AngleInDegrees; 
    } 
    set 
    { 
    if (value < 0 || value > 360) 
    { 
     _AngleInDegrees = NormalizeAngle(value); 
    } 
    else 
    { 
     _AngleInDegrees = value; 
    } 
    } 
} 

¿Y si tuviera una propiedad AngleInDegrees en muchos objetos? ¿Qué sucede si tiene una clase que consume ángulos producidos por otros componentes en su aplicación? ¿Quién debería hacer la validación? ¿Es útil contar siempre trabajando con ángulos "buenos"?

Al tener un tipo AngleInDegrees, es posible poner todas las operaciones de validación y especiales "Ángulo" en el tipo. También es posible escribir con fuerza todos los lugares donde desea usar AngleInDegrees.

Como dije, no sé si este es el tipo de cosa que está tratando de lograr o no. Se me acaba de ocurrir al leer su pregunta que tenía una especie de la misma idea cuando vi por primera vez el proyecto que he vinculado (es decir,que parecía que estaban, de hecho, subclasificando los tipos de datos primitivos para hacer tipos primitivos más restrictivos).

Cuestiones relacionadas