explícito e implícito c#


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#. Busqué en el diccionario el significado y esto es lo que obtuve:

Implícito

"Algo que está implícito se expresa de manera indirecta."

" Si una cualidad o elemento está implícito en algo, está involucrado en él o es mostrado por él;"

Explicit

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

"Si eres explícito acerca de algo, hablas de ello muy abierta y claramente."

Me gustaría entenderlo en C#.

Gracias por su ayuda.

Salud


Información adicional:

Aquí hay una parte de la oración en el libro lo que estoy leyendo ahora que tiene esta palabra "implícita"

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

No entiendo lo que esta frase aquí tratando de decir.

Author: Joey, 2009-07-24

7 answers

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

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

Si desea crear un nuevo Role y asignarle un Name, normalmente lo hará de la siguiente manera:

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

Dado que solo tiene una propiedad, tal vez sería conveniente si pudiéramos hacerlo así:{[17]]}

Role role = "RoleName";

Esto significa que queremos implícitamente convertir una cadena en un Role (ya que no hay un reparto específico involucrado en el código). Para lograr esto, agregamos un operador de conversión implícito:

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

Otra opción es implementar un operador de conversión explícito:

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

En este caso, no podemos convertir implícitamente una cadena en un Role, pero necesitamos convertirla en nuestro código:

Role r = (Role)"RoleName";
 101
Author: Fredrik Mörk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-24 09:47:56

En general

  • Implícito: se está haciendo algo por ti automáticamente.
  • Explícito: has escrito algo en el código fuente para indicar lo que quieres 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ícito y explícito se usan bastante en contextos diferentes, pero el significado general siempre estará en esa línea.

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 aquella que tienepara ser declarado explícitamente; una versión implícita es aquella que puede ser utilizada implícitamente, es decir, sin que el código tenga que declararla.)

 51
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-24 09:55:32

Considera que tienes 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 puedes 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

La conversión implícita está destinada a ser utilizada cuando la conversión no pierde precisión. La conversión explícita significa que puedes perder algo de precisión y debes declarar claramente que sabes lo que estás haciendo.

También hay un segundo contexto en el que se aplican términos implícitos/explícitos: la implementación de la interfaz. Alli 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

Por lo tanto, cuando se utiliza una implementación de interfaz explícita, los métodos de interfaz no son visibles cuando se utiliza concrete type. Esto se puede usar cuando interface es una interfaz auxiliar, no es parte de la responsabilidad principal de class's y no desea métodos adicionales para engañar a alguien que usa su código.

 9
Author: maciejkow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-24 09:53:43

Creo que este enlace deja bastante claro lo que es una conversión implícita - es una en la que no es necesario convertir explícitamente el valor en una asignación. Por lo tanto, en lugar de hacer

myDigit = (Digit) myDouble 

...solo puedes hacer:

myDigit = myDouble;
 2
Author: Gary McGill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-24 09:44:40

Ser explícito en C# se trata principalmente de mostrar sus intenciones de manera clara e inequívoca.

Por ejemplo:

class MyClass
{
    string myField;

    void MyMethod(int someNumber)
    {

    }
}

En el código anterior, la visibilidad de la clase, el campo y el método están implícitos. Utilizan los valores predeterminados del compilador.

Ahora, nunca puedo recordar cuáles son los valores predeterminados del compilador, y tal vez sus colegas tampoco pueden, así 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)
    {
    }
}
 1
Author: Colin Mackay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-24 09:44:07

Implícito puede tomarse como implícito, pero explícito significa que usted afirma que debe hacerse usted mismo. Como con los moldes. Aquí hay un molde implícito:

int implicit;
implicit = 7.5;

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

Aquí está explícito:

int explicit;
explicit = (int)7.5;

Aquí le dices al compilador que quieres que se lance. Usted declara explícitamente la conversión. Espero que eso ayude. Fuente: http://cboard.cprogramming.com/cplusplus-programming/24371-implicit-explicit.html

 0
Author: Roque Mejos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-17 01:28:35

Este es un gran recurso para aprender C#: http://www.functionx.com/csharp /

Echa un vistazo aquí específicamente: http://www.functionx.com/csharp/math/Lesson20.htm

 -1
Author: Andrew Siemer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-24 09:45:42