Jaki jest odpowiednik Javy w C#?

Jaki jest odpowiednik Javy final W C#?

Author: Stephen Kennedy, 2009-08-25

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.

 883
Author: Noldorin,
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 # jest sealed.
  • dla pola final odpowiednikiem C # jest readonly.
  • dla zmiennej lokalnej lub parametru metody final nie ma bezpośredniego odpowiednika C#.
 190
Author: LukeH,
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.

 48
Author: Some guy,
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.

Co do reszty, to jest skomplikowane.
  • 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.

 7
Author: Vlasec,
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

 6
Author: Vijayakumarpl,
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

Http://en.csharp-online.net/CSharp_FAQ:_What_are_the_differences_between_CSharp_and_Java_constant_declarations

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.

 5
Author: Krzysztof Krasoń,
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

 0
Author: x2.,
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