Co jest równoważne Javie final
w C #?
c#
access-modifiers
reserved-words
Nosrama
źródło
źródło
Odpowiedzi:
final
Kluczowe ma kilka zwyczajów w Javie. Odpowiada zarówno słowom kluczowym, jaksealed
ireadonly
słowom kluczowym w języku C #, w zależności od kontekstu, w którym jest używany.Klasy
Aby zapobiec podklasom (dziedziczeniu po zdefiniowanej klasie):
Jawa
DO#
Metody
Zapobiegaj zastąpieniu
virtual
metody.Jawa
DO#
Jak zauważa Joachim Sauer, zauważalną różnicą między tymi dwoma językami jest to, że Java domyślnie oznacza wszystkie metody niestatyczne jako
virtual
, natomiast C # oznacza je jakosealed
. Dlatego też musisz użyćsealed
słowa kluczowego w języku C #, jeśli chcesz zatrzymać dalsze zastępowanie metody, która została wyraźnie oznaczonavirtual
w klasie bazowej.Zmienne
Aby umożliwić przypisanie zmiennej tylko raz:
Jawa
DO#
Na marginesie, efekt
readonly
słowa kluczowego różni się odconst
słowa kluczowego tym, żereadonly
wyrażenie jest oceniane w czasie wykonywania, a nie w czasie kompilacji , co pozwala na dowolne wyrażenia.źródło
readonly
zmienne składowe mogą być modyfikowane w konstruktorach: pastebin.com/AzqzYGiATo zależy od kontekstu.
final
klasy lub metody odpowiednikiem C # jestsealed
.final
pola odpowiednikiem C # jestreadonly
.final
zmiennej lokalnej lub parametru metody nie ma bezpośredniego odpowiednika C #.źródło
For a final local variable or method parameter, there's no direct C# equivalent
ogromne wyróżnienie.const
można stosować tylko w przypadku typów wartości. O ile mi wiadomo, nie ma sposobu, aby stworzyć efektywną stałą dla lokalnego typu odniesienia.To, czego tu wszyscy brakuje, to gwarancja Java dla definitywnego przypisania ostatecznych zmiennych składowych.
W przypadku klasy C z końcową zmienną składową V każda możliwa ścieżka wykonania przez każdego konstruktora C musi przypisać V dokładnie jeden raz - niepowodzenie przypisania V lub przypisanie V dwa lub więcej razy spowoduje błąd.
Słowo kluczowe readonly w C # nie ma takiej gwarancji - kompilator chętnie pozostawia członków readonly nieprzypisanymi lub pozwala ci przypisywać je wielokrotnie w konstruktorze.
Zatem ostateczny i tylko do odczytu (przynajmniej w odniesieniu do zmiennych składowych) zdecydowanie nie są równoważne - końcowy jest znacznie bardziej rygorystyczny.
źródło
Jak wspomniano,
sealed
jest odpowiednikiemfinal
metod i klas.Jeśli chodzi o resztę, jest to skomplikowane.
W przypadku
static final
pólstatic readonly
jest to najbliższa możliwa rzecz. Pozwala na inicjalizację pola statycznego w konstruktorze statycznym, który jest dość podobny do statycznego inicjalizatora w Javie. Dotyczy to zarówno stałych (prymitywów i obiektów niezmiennych), jak i stałych odniesień do obiektów zmiennych.const
Modyfikator jest dość podobna do stałych, ale nie można ustawić je w konstruktorze statycznym.readonly
Można użyć pola, które nie powinno zostać ponownie przypisane po opuszczeniu konstruktora . Nie jest jednak równy -final
wymaga dokładnie jednego przypisania, nawet w konstruktorze lub inicjalizatorze.Nie ma odpowiednika C # dla
final
zmiennej lokalnej, o której wiem. Jeśli zastanawiasz się, dlaczego ktokolwiek miałby go potrzebować: możesz zadeklarować zmienną przed if-else, skrzynką lub tym podobnym. Deklarując to jako ostateczne, egzekwujesz, że jest on przypisany maksymalnie raz.Zasadniczo zmienne lokalne Java muszą zostać przypisane przynajmniej raz przed ich odczytaniem. O ile gałąź nie wyskoczy przed odczytaniem wartości, zmienna końcowa jest przypisywana dokładnie raz. Wszystko to sprawdzane jest podczas kompilacji. Wymaga to dobrze zachowującego się kodu z mniejszym marginesem błędu.
Podsumowując, C # nie ma bezpośredniego odpowiednika
final
. Podczas gdy Java nie posiada kilku fajnych funkcji C #, dla mnie jako odświeżającego programisty Javy jest to odświeżenie, aby zobaczyć, gdzie C # nie zapewnia odpowiednika.źródło
Ostateczne klasy Java i końcowe metody -> zapieczętowane. Ostateczna zmienna elementu Java -> tylko do odczytu dla stałej czasu wykonywania, const dla stałej czasu kompilacji.
Brak odpowiednika dla ostatecznej zmiennej lokalnej i argumentu końcowego metody
źródło
http://en.csharp-online.net/CSharp_FAQ:_What_are_the_differences_between_CSharp_and_Java_constant_declarations
Stałe C # deklarowane są za pomocą słowa kluczowego const dla stałych kompilacyjnych lub słowa kluczowego readonly dla stałych wykonawczych. Semantyka stałych jest taka sama zarówno w językach C #, jak i Java.
źródło
zapieczętowany
źródło