Jaki jest odpowiednik Javy w C#?
Jaki jest odpowiednik Javy final
W C#?
7 answers
The final
słowo kluczowe ma kilka zastosowań w Javie. Odpowiada zarówno sealed
oraz readonly
słowa kluczowe w C#, w zależności od kontekstu, w którym jest używany.
Klasy
Aby zapobiec podklasowaniu (dziedziczeniu ze zdefiniowanej klasy):
Java
public final class MyFinalClass {...}
C #
public sealed class MyFinalClass {...}
Metody
Zapobiegaj nadpisywaniu virtual
metoda.
Java
public class MyClass
{
public final void myFinalMethod() {...}
}
C #
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
Jak zauważa Joachim Sauer, zauważalną różnicą między tymi dwoma językami jest to, że Java domyślnie oznacza wszystkie niestatyczne metody jako virtual
, podczas gdy C# oznacza je jako sealed
. Dlatego wystarczy użyć słowa kluczowego sealed
W C#, jeśli chcesz przestać nadpisywać metodę, która została wyraźnie oznaczona virtual
w klasie bazowej.
Zmienne
Aby umożliwić przypisanie zmiennej tylko raz:
Java
public final double pi = 3.14; // essentially a constant
C #
public readonly double pi = 3.14; // essentially a constant
Na marginesie, efekt słowa kluczowego readonly
różni się odconst
słowo kluczowe w tym, że wyrażenie readonly
jest oceniane w runtime zamiast compile-time, co pozwala na dowolne wyrażenia.
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
2020-06-20 09:12:55
To zależy od kontekstu.
- dla klasy lub metody
final
odpowiednikiem C # jestsealed
. - dla pola
final
odpowiednikiem C # jestreadonly
. - dla zmiennej lokalnej lub parametru metody
final
nie ma bezpośredniego odpowiednika C#.
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-08-25 11:37:40
Wszystkim tutaj brakuje gwarancji Javy na definitywne przypisanie zmiennych końcowych.
Dla klasy C z końcową zmienną składową V, każda możliwa ścieżka wykonania przez każdy konstruktor C musi przypisać V dokładnie raz - brak przypisania V lub przypisanie V dwa lub więcej razy spowoduje błąd.
Słowo kluczowe readonly w C#nie ma takiej gwarancji - kompilator jest bardziej niż szczęśliwy, pozostawiając członków readonly nieprzypisanych lub pozwala przypisać im wiele czasy w konstruktorze.
Tak więc, final i readonly (przynajmniej w odniesieniu do zmiennych członkowskich) nie są równoważne - final jest znacznie bardziej rygorystyczne.
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
2010-05-07 18:45:41
Jak wspomniano, {[0] } jest odpowiednikiem final
dla metod i klas.
-
Dla
static final
pól,static readonly
jest najbliższą rzeczą możliwą. Pozwala na inicjalizację statycznego pola w statycznym konstruktorze, który jest dość podobny do statycznego inicjalizatora w Javie. Dotyczy to zarówno stałych (obiektów pierwotnych i niezmiennych), jak i stałych odniesień do obiektów zmiennych.Modyfikator
const
jest dość podobny do stałe, ale nie można ich ustawić w statycznym konstruktorze. -
Na polu, które nie powinno być przypisane po opuszczeniu konstruktora, można użyć
readonly
. Nie jest jednak równe-final
wymaga dokładnie jednego przypisania nawet w konstruktorze lub inicjalizatorze. -
Nie ma odpowiednika C# dla zmiennej lokalnej
final
, o której wiem. Jeśli zastanawiasz się, po co komuś to potrzebne: możesz zadeklarować zmienną przed if-else, switch-case lub tak. Przez deklarując, że jest ostateczna, wymuszasz, że jest przypisana co najwyżej raz.Zmienne lokalne Javy w ogóle muszą być przypisane przynajmniej raz przed ich odczytaniem. Jeśli gałąź nie wyskoczy przed odczytaniem wartości, ostateczna zmienna zostanie przypisana dokładnie raz. Wszystko to jest sprawdzane w czasie kompilacji. Wymaga to dobrze zachowanego kodu z mniejszym marginesem błędu.
Podsumowując, C# nie ma bezpośredniego odpowiednika final
. Chociaż w Javie brakuje kilku fajnych funkcji C#, to odświeża dla mnie jako programisty Javy, aby zobaczyć, gdzie C# nie dostarcza odpowiednika.
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
2020-06-20 09:12:55
Klasa Java final i metoda final - > sealed. Zmienna member Java final - > readonly dla stałej runtime, const dla stałej czasowej kompilacji.
Brak odpowiednika dla zmiennej lokalnej final i argumentu metody final
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-08-25 11:30:17
Stałe C# są deklarowane za pomocą słowa kluczowego const dla stałych czasu kompilacji lub słowa kluczowego readonly dla stałych runtime. Semantyka stałych jest taka sama zarówno w językach C#, jak i Java.
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-08-25 11:08:28
Sealed
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-08-25 11:07:05