2012-05-29 9 views
5

Tengo una función que establece un estado de dibujo para un mosaico específico dado otro mosaico. El mosaico que está en estado de dibujo va a cambiar, compara los mosaicos que lo rodean y luego se actualiza en consecuencia. Voy a tratar de ilustrar que a continuación¿Hay alguna forma de salir de una función que devuelve vacía?

[b] [b] [a] 
[b] [a] [a] 
[a] [a] [a] where a = sand && b = water 

cuando detecta que un b está al borde de ella, debe actualizar su empate por el estado. Así que tengo una función que funciona para mayúsculas, minúsculas, mayúsculas y minúsculas. Ahora necesito modificar esa función para que pueda manejar un caso de izquierda a derecha, la caja superior derecha, la caja inferior derecha, etc, etc Aquí está mi función

public override void CompareBorderingTiles(Tile T) 
    { 
     if (T is Water) 
     { 
      float leftBound = location.X - (Tile.TileWidth * Tile.TileScale); 
      float rightBound = location.X + (Tile.TileWidth * Tile.TileScale); 
      float upperBound = location.Y - (Tile.TileHieght * Tile.TileScale); 
      float bottomBound = location.Y + (Tile.TileHieght * Tile.TileScale); 
      if (T.GridLocation.X == leftBound) 
      { 
       drawstate = DrawState.Left; 
      } 
      if (T.GridLocation.X == rightBound) 
       drawstate = DrawState.Right; 
      if (T.GridLocation.Y == upperBound) 
       drawstate = DrawState.Upper; 
      if (T.GridLocation.Y == bottomBound) 
       drawstate = DrawState.Lower; 
     } 

     base.CompareBorderingTiles(T); 
    } 

Debe ser bastante explicativo de por qué Quisiera salir de esta función, o tal vez no. Básicamente, tengo una enumeración que me dice cuál es mi estado de extracción (el estado de enderezamiento es la enumeración). ¿Alguien puede decirme si puedo establecer el estado de dibujo correcto y luego salir de mi función?

+3

se ¿Quiere decir que quiere detener su función? si es cierto, puede usar 'return;' para él –

Respuesta

17

sólo tiene que utilizar una instrucción de retorno en el que desea terminar:

return; 

Por lo tanto, en el código que podría hacer:

public override void CompareBorderingTiles(Tile T) 
{ 
    if (T is Water) 
    { 
     float leftBound = location.X - (Tile.TileWidth * Tile.TileScale); 
     float rightBound = location.X + (Tile.TileWidth * Tile.TileScale); 
     float upperBound = location.Y - (Tile.TileHieght * Tile.TileScale); 
     float bottomBound = location.Y + (Tile.TileHieght * Tile.TileScale); 
     if (T.GridLocation.X == leftBound) 
     { 
      drawstate = DrawState.Left; 
      return; 
     } 
     if (T.GridLocation.X == rightBound) 
     { 
      drawstate = DrawState.Right; 
      return; 
     } 
     if (T.GridLocation.Y == upperBound) 
     { 
      drawstate = DrawState.Upper; 
      return; 
     } 
     if (T.GridLocation.Y == bottomBound) 
     { 
      drawstate = DrawState.Lower; 
      return; 
     } 
    } 

    base.CompareBorderingTiles(T); 
} 
+0

No sabía que podía usar la palabra clave return por sí solo así, gracias. –

7

Simplemente use return; en sí mismo, esto "devolverá" inmediatamente la función.

Sin embargo, reflexionando ¿realmente necesita regresar?

if (T.GridLocation.X == leftBound) 
    { 
     drawstate = DrawState.Left; 
    } 
    else if (T.GridLocation.X == rightBound) 
    { 
     drawstate = DrawState.Right; 
    } 

    else if (T.GridLocation.Y == upperBound) 
    { 
     drawstate = DrawState.Upper; 
    } 
    else if (T.GridLocation.Y == bottomBound) 
    { 
     drawstate = DrawState.Lower; 
    } 

Eso debería hacer que el código sea más fácil de mantener en el futuro.

+0

Carl venció a la competencia por 2 segundos :) – Brady

+0

¡jajaja hubiera sido más rápido si no fuera por el mínimo de 30 caracteres! :) –

+0

Sí, creo que debería hacerlo porque voy a tener que establecer un estado superior izquierdo, un estado inferior izquierdo, etc. en función de dónde está el mosaico en mi cuadrícula. –

7

Puede salir de una función con return.

+0

ah No sabía que podía usar la palabra clave return por sí mismo, me siento como un idiota ahora, gracias. –

3

Puede usar return; en cualquier punto de la función y dejará la función en ese momento. El uso de return significaría que se llamaría a su función base no. Si necesita la función de base a llamarse uso else if luego, cuando esté condición se cumple que no comprobará el resto de las sentencias if

public override void CompareBorderingTiles(Tile T) 
    { 
     if (T is Water) 
     { 
      float leftBound = location.X - (Tile.TileWidth * Tile.TileScale); 
      float rightBound = location.X + (Tile.TileWidth * Tile.TileScale); 
      float upperBound = location.Y - (Tile.TileHieght * Tile.TileScale); 
      float bottomBound = location.Y + (Tile.TileHieght * Tile.TileScale); 
      if (T.GridLocation.X == leftBound) 
      { 
       drawstate = DrawState.Left; 
      } 
      else if (T.GridLocation.X == rightBound) 
       drawstate = DrawState.Right; 
      else if (T.GridLocation.Y == upperBound) 
       drawstate = DrawState.Upper; 
      else if (T.GridLocation.Y == bottomBound) 
       drawstate = DrawState.Lower; 
     } 

     base.CompareBorderingTiles(T); 
    } 
+0

Esto - incluso si no quieres llamar a la función 'base', simplemente envuélvela en un else. Estos 'else if's son mucho más fáciles de seguir que muchos' return's salpicados. – Rawling

+0

me ganas por 2 segundos –

0

uso return; la función devolverá como un vacío

Cuestiones relacionadas