2009-07-24 15 views
42

Soy nuevo en C# y estoy aprendiendo nuevas palabras. Me resulta difícil entender cuál es el significado de estas dos palabras cuando se trata de programar C#. me miraba en el diccionario el significado y esto es lo que tengo:explícito e implícito C#

implícito

"Algo que está implícita se expresa de un modo indirecto."

"Si una calidad o elemento está implícito en algo, está involucrado en él o lo muestra;"

explícita

"Algo que es explícito se expresa o se muestra clara y abiertamente, sin ningún intento de ocultar nada"

"Si usted es explícito acerca de algo, que hablan de es muy abierta y clara ".

Me gustaría entenderlo en C#.

Gracias por su ayuda.

Saludos


información adicional:

Aquí está una parte de la frase en el libro lo que estoy leyendo ahora que tiene esta palabra "implícita"

"Esto significa ese Área y Ocupantes dentro de AreaPerPerson()implícitamente se refieren a las copias de esas variables encontradas en el objeto que invoca AreaPerPerson() "

No entiendo lo que esta frase intenta decir.

+0

tal vez nunca me encuentro con ellos. Pero, ¿de qué contexto estás hablando? Nunca antes había escuchado sobre aplicaciones explícitas e implícitas en C#. –

+0

De hecho, da el rango de respuestas que hay muchos contextos en C#. –

+0

El uso de "implícito" en el texto que cita es tan misterioso para usted como lo es para mí. Probablemente tenga sentido en ese contexto, pero ciertamente no es un término del lenguaje de programación C# general. – reinierpost

Respuesta

85

Las palabras clave implicit y explicit en C# se utilizan al declarar operadores de conversión. Digamos que usted tiene la siguiente clase:

public class Role 
{ 
    public string Name { get; set; } 
} 

Si desea crear un nuevo Role y asignar un Name a ella, por lo general lo hará así:

Role role = new Role(); 
role.Name = "RoleName"; 

ya que sólo tiene una propiedad, tal vez sería conveniente si en vez podríamos hacerlo así:

Role role = "RoleName"; 

esto significa que queremos impl icitly convertir una cadena a Role (ya que no hay un molde específico involucrado en el código). Para lograr esto, le sumamos un operador de conversión implícita:

public static implicit operator Role(string roleName) 
{ 
    return new Role() { Name = roleName }; 
} 

Otra opción es poner en práctica un operador de conversión explícita:

public static explicit operator Role(string roleName) 
{ 
    return new Role() { Name = roleName }; 
} 

En este caso, no se puede convertir implícitamente una cadena a un Role, pero tenemos que echarlo en nuestro código:

Role r = (Role)"RoleName"; 
+0

gracias por explicar. ¿Cuándo usamos esto? – tintincutes

+6

@tintincute: ¡muy raramente! Las conversiones personalizadas solo son ocasionalmente útiles, al igual que los operadores definidos por el usuario. –

+1

buen ejemplo, + acepto con jon. – tim

44

En general

  • implícita: algo se está haciendo de forma automática.
  • Explícito: ha escrito algo en el código fuente para indicar lo que quiere que suceda.

Por ejemplo:

int x = 10; 
long y = x; // Implicit conversion from int to long 
int z = (int) y; // Explicit conversion from long to int 

implícitos y explícitos se utilizan mucho en diferentes contextos, pero el significado general siempre habrá a lo largo de esas líneas.

Tenga en cuenta que ocasionalmente los dos pueden unirse.Por ejemplo:

int x = 10; 
long y = (long) x; // Explicit use of implicit conversion! 

(una conversión explícita es una que tiene ser que explícitamente; una versión implícita es uno que puede usarse implícitamente, es decir, sin el código de tener que indicar que.)

+0

¿El als de 'var' no sería un buen contexto de tipeo implícito y explícito aquí? implícito 'var impl = new {Field1 =" EUR ", Field2 = 9.40};' y explícito con definición de clase 'public class Conversión {string Field1 {get; conjunto; } public double Field2 {get; conjunto; }} 'y asigne ' Conversion expl = new Conversion(); expl.Field1 = "EUR"; expl.Field2 = 9.40; ' – Independent

+0

@Jonas: No estoy seguro de a qué te refieres aquí, me temo. –

+0

Okey, le doy una nueva oportunidad. 'var' se considera como" variables implícitamente tipadas "en C#? – Independent

1

Ser explícito en C# se trata principalmente de mostrar sus intenciones de forma clara y sin ambigüedades.

Por ejemplo:

class MyClass 
{ 
    string myField; 

    void MyMethod(int someNumber) 
    { 

    } 
} 

En el código anterior de la visibilidad de la clase, el campo y método son todos implícito. Usan los valores predeterminados del compilador.

Ahora, nunca puedo recordar qué son los valores predeterminados del compilador, y tal vez sus colegas tampoco, por lo que en lugar de confiar en que todos recuerden cuáles son los valores predeterminados, puede ser explícito.

public class MyClass 
{ 
    private string myField; 

    public void MyMethod(int someNumber) 
    { 
    } 
} 
2

creo this link hace que sea bastante claro lo que una conversión implícita es - es una de las que no es necesario convertir explícitamente el valor de una asignación. Así, en lugar de hacer

myDigit = (Digit) myDouble 

... sólo puede hacer:

myDigit = myDouble; 
7

Considere que tiene dos clases:

internal class Explicit 
{ 
    public static explicit operator int (Explicit a) 
    { 
     return 5; 
    } 
} 


internal class Implicit 
{ 
    public static implicit operator int(Implicit a) 
    { 
     return 5; 
    } 
} 

y dos objetos:

var obj1 = new Explicit(); 
var obj2 = new Implicit(); 

ahora se puede escribir:

int integer = obj2; // implicit conversion - you don't have to use (int) 

o:

int integer = (int)obj1; // explicit conversion 

pero:

int integer = obj1; // WON'T WORK - explicit cast required 

conversión implícita está destinado a ser usado cuando la conversión no pierde precisión. La conversión explícita significa que puede perder cierta precisión y debe indicar claramente que sabe lo que está haciendo.

También hay un segundo contexto en el que se aplican términos implícitos/explícitos: implementación de la interfaz. No hay palabras clave en ese caso.

internal interface ITest 
{ 
    void Foo(); 
} 

class Implicit : ITest 
{ 
    public void Foo() 
    { 
     throw new NotImplementedException(); 
    } 
} 

class Explicit : ITest 
{ 
    void ITest.Foo() // note there's no public keyword! 
    { 
     throw new NotImplementedException(); 
    } 
} 

Implicit imp = new Implicit(); 
imp.Foo(); 
Explicit exp = new Explicit(); 
// exp.Foo(); // won't work - Foo is not visible 
ITest interf = exp; 
interf.Foo(); // will work 

Así que cuando se utiliza la implementación de interfaz explícita, los métodos de la interfaz no son visibles cuando se utiliza el tipo de hormigón. Esto se puede usar cuando la interfaz es una interfaz de ayuda, no es parte de la responsabilidad primaria de la clase y no desea métodos adicionales para engañar a alguien que use su código.

0

implícito se puede tomar como implícita, pero los medios explícitos que se Estado hay que hacerlo usted mismo. Al igual que con los moldes. Aquí hay un elenco implícito:

int implicit; 
implicit = 7.5; 

El valor '7.5' se lanzará implícitamente como int. Esto significa que el compilador lo hace por usted.

Aquí es explícita:

int explicit; 
explicit = (int)7.5; 

Aquí se indica al compilador que desea echó. Usted declara explícitamente la conversión. Espero que ayude. Fuente: http://cboard.cprogramming.com/cplusplus-programming/24371-implicit-explicit.html

Cuestiones relacionadas