jawne i niejawne c#

Jestem nowy w C# i uczę się nowych słów. Trudno mi zrozumieć, co znaczą te dwa słowa, Jeśli chodzi o programowanie c#. Szukałem w słowniku znaczenia i oto co mam:

Implicit

"coś, co jest dorozumiane, wyraża się w sposób pośredni."

"Jeśli jakość lub element jest w czymś ukryty, jest w tym zaangażowany lub jest przez to pokazany;"

Explicit

"coś, co jest jawne, jest wyrażone lub pokazane jasno i otwarcie, bez żadnej próby ukrycia czegokolwiek"

"jeśli mówisz coś jasno, mówisz o tym bardzo otwarcie i jasno."

Chciałbym to zrozumieć w C#. Dzięki za pomoc.

Cheers


Dodatkowe informacje:

Oto część zdania w książce co teraz czytam, która ma słowo "implicit"

" oznacza to, że obszar i mieszkańców wewnątrz AreaPerPerson( ) domyślnie odnoszą się do kopii tych zmiennych znalezionych w obiekcie, który wywołuje AreaPerPerson( ) "

Nie rozumiem, co to zdanie próbuje powiedzieć.
Author: Joey, 2009-07-24

7 answers

The implicit oraz explicit słowa kluczowe w C# są używane przy deklarowaniu operatorów konwersji. Załóżmy, że masz następującą klasę:

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

Jeśli chcesz utworzyć nowy Role i przypisać do niego Name, zazwyczaj zrobisz to tak:

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

Ponieważ ma tylko jedną właściwość, być może byłoby wygodniej, gdybyśmy mogli zrobić to w ten sposób:

Role role = "RoleName";

Oznacza to, że chcemy implicite przekonwertować łańcuch znaków na Role (ponieważ w Kodeksie nie ma konkretnej obsady). Aby to osiągnąć, dodajemy implicit conversion operator:

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

Inną opcją jest zaimplementowanie jawnego operatora konwersji:

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

W tym przypadku, nie możemy pośrednio przekonwertować ciągu znaków na Role, ale musimy go umieścić w naszym kodzie:

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/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-24 09:47:56

Ogólnie

  • Implicit: coś jest robione dla ciebie automatycznie.
  • Explicit: napisałeś coś w kodzie źródłowym, aby wskazać, co chcesz się wydarzyć.

Na przykład:

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

Implicit i explicit są używane dość często w różnych kontekstach, ale ogólne znaczenie zawsze będzie podobne do tych.

Zauważ, że od czasu do czasu te dwie rzeczy mogą się ze sobą łączyć. Na przykład:

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

(Konwersja jawna to taka, która ma być określone jawnie; wersja dorozumiana to taka, która Może być używana dorozumiana, tzn. bez konieczności podawania kodu.)

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-24 09:55:32

Weź pod uwagę, że masz dwie klasy:

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


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

I dwa obiekty:

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

Możesz teraz napisać:

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

Lub:

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

Ale:

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

Implicit conversion jest przeznaczony do użycia, gdy konwersja nie traci żadnej precyzji. Konwersja Jawna oznacza, że możesz stracić pewną precyzję i musisz jasno stwierdzić, że wiesz, co robisz.

Istnieje również drugi kontekst, w którym stosuje się terminy implicit/explicit - implementacja interfejsu. Tam w takim przypadku nie ma słów kluczowych.

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

Więc gdy używasz jawnej implementacji interfejsu, metody interfejsu nie są widoczne, gdy używasz concrete type. Może to być użyte, gdy interfejs jest interfejsem pomocniczym, a nie częścią podstawowej odpowiedzialności klas i nie chcesz, aby dodatkowe metody wprowadzały kogoś w błąd używając Twojego kodu.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-24 09:53:43

Myślę, że ten link wyjaśnia, czym jest konwersja ukryta - jest to taka, w której nie trzeba wyraźnie rzucać wartości w przypisaniu. Więc zamiast robić

myDigit = (Digit) myDouble 

...można po prostu zrobić:

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/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-24 09:44:40

Bycie wyraźnym w C# polega głównie na wyraźnym i jednoznacznym pokazaniu swoich intencji.

Na przykład:

class MyClass
{
    string myField;

    void MyMethod(int someNumber)
    {

    }
}

W powyższym kodzie widoczność klasy, pola i metody są implikowane. Używają domyślnych wartości kompilatora.

Teraz, nigdy nie pamiętam, jakie są domyślne ustawienia kompilatora, i może twoi koledzy też nie mogą, więc zamiast polegać na tym, że wszyscy pamiętają, jakie są domyślne, możesz być wyraźny.

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/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-24 09:44:07

Implicit można traktować jako implicit, ale explicit oznacza, że należy to zrobić samemu. Jak z odlewami. Oto ukryta Obsada:

int implicit;
implicit = 7.5;

Wartość ' 7.5 ' będzie domyślnie rzucana jako int. Oznacza to, że kompilator robi to za Ciebie.

Tutaj jest wyraźnie:

int explicit;
explicit = (int)7.5;

Tutaj powiedz kompilatorowi, że chcesz go obsadzić. Jawnie deklarujesz konwersję. Mam nadzieję, że to pomoże. Źródło: 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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-17 01:28:35

Jest to świetny zasób do nauki C#: http://www.functionx.com/csharp/

Spójrz tutaj konkretnie: 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/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-24 09:45:42