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
Chciałbym to zrozumieć w C#. Dzięki za pomoc."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."
Cheers
Dodatkowe informacje:
Oto część zdania w książce co teraz czytam, która ma słowo "implicit"
Nie rozumiem, co to zdanie próbuje powiedzieć." 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łujeAreaPerPerson( )
"
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";
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.)
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.
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;
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)
{
}
}
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
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
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