web-dev-qa-db-fra.com

c # explicite et implicite

Je suis nouveau en C # et apprendre de nouveaux mots. J'ai du mal à comprendre quelle est la signification de ces deux mots lorsqu'il s'agit de programmer c #. J'ai cherché dans le dictionnaire la signification et voici ce que j'ai obtenu:

Implicite

"Quelque chose qui est implicite est exprimé de manière indirecte."

"Si une qualité ou un élément est implicite dans quelque chose, il est impliqué ou montré par elle;"

Explicite

"Quelque chose d'explicite est exprimé ou montré clairement et ouvertement, sans aucune tentative de cacher quoi que ce soit"

"Si vous êtes explicite à propos de quelque chose, vous en parlez très ouvertement et clairement."

Je voudrais le comprendre en C #.

Merci de votre aide. 

À votre santé


information additionnelle:

Voici une partie de la phrase du livre que je lis actuellement et qui a ce mot "implicite"

"Cela signifie que la zone et les occupants de AreaPerPerson( ) implicitement font référence aux copies de ces variables trouvées dans l'objet qui appelle AreaPerPerson( )"

Je ne comprends vraiment pas ce que cette phrase essaye de dire.

54
tintincutes

Les mots clés implicit et explicit en C # sont utilisés lors de la déclaration des opérateurs de conversion. Disons que vous avez la classe suivante:

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

Si vous souhaitez créer une nouvelle variable Role et lui affecter une variable Name, procédez comme suit:

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

Comme il n’a qu’une propriété, il serait peut-être plus pratique de le faire comme ceci:

Role role = "RoleName";

Cela signifie que nous voulons implicitement convertir une chaîne en Role (puisqu'il n'y a pas de conversion spécifique impliquée dans le code). Pour cela, nous ajoutons un opérateur de conversion implicite:

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

Une autre option consiste à implémenter un opérateur de conversion explicite:

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

Dans ce cas, nous ne pouvons pas implicitement convertir une chaîne en Role, mais nous devons la convertir dans notre code:

Role r = (Role)"RoleName";
105
Fredrik Mörk

En général

  • Implicite: quelque chose est fait pour vous automatiquement.
  • Explicite: vous avez écrit quelque chose dans le code source pour indiquer ce que vous voulez qu'il se passe.

Par exemple:

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

Implicites et explicites sont très utilisés dans différents contextes, mais le sens général restera toujours dans cette direction.

Notez que parfois les deux peuvent se réunir. Par exemple:

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

(Une conversion explicite est une conversion que doit déclarer explicitement; une version implicite est une version qui peut être utilisée peut de manière implicite, c'est-à-dire sans que le code soit obligé de l'indiquer.)

53
Jon Skeet

Considérez que vous avez deux classes:

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


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

et deux objets:

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

vous pouvez maintenant écrire:

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

ou:

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

mais:

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

La conversion implicite est destinée à être utilisée lorsque la conversion ne perd aucune précision. La conversion explicite signifie que vous pouvez perdre de la précision et que vous devez clairement indiquer que vous savez ce que vous faites.

Il existe également un deuxième contexte dans lequel les termes implicites/explicites sont appliqués - la mise en œuvre d'interface. Il n'y a pas de mots-clés dans ce cas.

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

Ainsi, lorsque vous utilisez une implémentation d'interface explicite, les méthodes de l'interface ne sont pas visibles lorsque vous utilisez un type concret. Cela peut être utilisé lorsque interface est une interface d'assistance, ne faisant pas partie de la responsabilité première de la classe et que vous ne voulez pas de méthodes supplémentaires pour induire en erreur quelqu'un qui utilise votre code.

9
maciejkow

Je pense que ce lien explique assez clairement ce qu'est une conversion implicite - il s'agit d'une conversion pour laquelle il n'est pas nécessaire d'indiquer explicitement la valeur dans une affectation. Donc, au lieu de faire

myDigit = (Digit) myDouble 

... tu peux juste faire:

myDigit = myDouble;
2
Gary McGill

Etre explicite en C # consiste principalement à montrer clairement et sans ambiguïté vos intentions.

Par exemple:

class MyClass
{
    string myField;

    void MyMethod(int someNumber)
    {

    }
}

Dans le code ci-dessus, la visibilité de la classe, du champ et de la méthode est implicite. Ils utilisent les valeurs par défaut du compilateur.

Maintenant, je ne me souviens jamais des valeurs par défaut du compilateur, et peut-être que vos collègues ne le peuvent pas non plus. Vous pouvez donc être explicite au lieu de compter sur tout le monde pour vous rappeler les valeurs par défaut.

public class MyClass
{
    private string myField;

    public void MyMethod(int someNumber)
    {
    }
}
1
Colin Mackay

Implicite peut être considéré comme implicite, mais explicite signifie que vous déclarez que cela doit être fait vous-même. Comme avec les moulages. Voici un casting implicite:

int implicit;
implicit = 7.5;

La valeur '7.5' sera implicitement convertie en int. Cela signifie que le compilateur le fait pour vous.

Voici explicite:

int explicit;
explicit = (int)7.5;

Ici, vous indiquez au compilateur que vous souhaitez le lancer. Vous déclarez explicitement la conversion. J'espère que cela pourra aider. Source: http://cboard.cprogramming.com/cplusplus-programming/24371-implicit-explicit.html

0
Roque Mejos