sharp - ¿Qué es esta extraña sintaxis de C#y cómo la construyo?
lenguaje de programacion c# ejemplos (4)
Esta pregunta ya tiene una respuesta aquí:
Al leer un proyecto, encontré un extraño código de C #:
public class F : IElement
{
public int CurrentHp { get; } = 10;
public bool IsDead => CurrentHp <= 0;
}
Normalmente escribiría algo como:
public class F : IElement
{
public const int CurrentHp = 10;
public bool IsDead
{
get { return CurrentHp <= 0; }
}
}
My Visual Studio 2013 tampoco puede reconocer el primer ejemplo.
¿Qué es esta sintaxis y qué debo hacer para que este proyecto sea edificable?
Como otras personas dijeron que es nuevas características de C # 6. Ver la lista completa en 1
Sin embargo, más correctamente esto se traduciría en esto antes de C # 6:
public class F : IElement
{
public int CurrentHp { get; private set };
public bool IsDead { get { return CurrentHp <= 0; } }
public F() { CurrentHp = 10; }
}
Es características de C # 6: Nuevas funciones de lenguaje en C # 6 .
El primero
public int CurrentHp { get; } = 10;
es propiedad autoconstructiva de Getter-only .
El segundo
public bool IsDead => CurrentHp <= 0;
es cuerpos de Expresión en miembros de funciones similares a propiedades .
Este es tu código si usas C # 6:
public bool IsDead => CurrentHp <= 0;
Es solo una propiedad con un get
, si usa este operador =>
.
En versiones anteriores, escribirías algo como esto:
public bool IsDead { get { return CurrentHp <= 0; } }
=>
es un nuevo operador en C # 6 e indica una Función de expresión de cuerpo para usar para ese captador.
Sus dos ejemplos son sinónimos en lo que respecta al compilador y simplemente devuelve el valor asignado. El =>
es azúcar sintáctico para facilitar el desarrollo y requiere menos líneas de código para lograr el mismo resultado.
Sin embargo, no podrá compilar a menos que actualice a VS2015 con la última versión del compilador.
Editar:
Como dijo Philip Kendall y Carl Leth en los comentarios, las primeras líneas en cada uno no son exactamente sinónimos de public const int CurrentHp = 10;
es un campo y public int CurrentHp { get; } = 10;
public int CurrentHp { get; } = 10;
es una propiedad. Aunque en un nivel alto el resultado es el mismo (asignando un valor de 10
a CurrentHp
con la propiedad solo configurable en el constructor de la clase), difieren en eso:
Con
const int CurrentHp = 10
,CurrentHp
siempre será10
, ocupará 4 bytes en total y se puede acceder estáticamente.int CurrentHp { get; } = 10
int CurrentHp { get; } = 10
predeterminado10
, pero se puede cambiar en el constructor deF
y, por lo tanto, puede ser diferente por instancia y no se puede acceder estáticamente.