Відповіді:
У final
Java є ключове слово. Він відповідає як sealed
і readonly
ключовим словам у C #, залежно від контексту, в якому він використовується.
Для запобігання підкласифікації (успадкування від визначеного класу):
Java
public final class MyFinalClass {...}
C #
public sealed class MyFinalClass {...}
Попередити переосмислення virtual
методу.
Java
public class MyClass
{
public final void myFinalMethod() {...}
}
C #
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
Як зазначає Йоахім Зауер, помітна різниця між двома мовами тут полягає в тому, що Java за замовчуванням позначає всі нестатичні методи як virtual
, тоді як C # позначає їх як sealed
. Отже, вам потрібно використовувати sealed
ключове слово у C # лише тоді, коли ви хочете зупинити подальше переосмислення методу, який явно позначений virtual
у базовому класі.
Щоб дозволити призначити змінну лише один раз:
Java
public final double pi = 3.14; // essentially a constant
C #
public readonly double pi = 3.14; // essentially a constant
Як бічна примітка, ефект readonly
ключового слова відрізняється від const
ключового слова тим, що readonly
вираз оцінюється під час виконання, а не під час компіляції , отже, допускаючи довільні вирази.
readonly
Змінні учасника можуть бути змінені в конструкторах: pastebin.com/AzqzYGiA
Це залежить від контексту.
final
класу чи методу еквівалент C # єsealed
.final
поля еквівалент C # єreadonly
.final
локальної змінної або параметра методу немає прямого еквівалента C #.For a final local variable or method parameter, there's no direct C# equivalent
величезну відмінність.
const
може використовуватися лише для типів значень. Наскільки я знаю, немає можливості зробити ефективну константу для локального типу.
Чого всі тут відсутні, - це гарантія Java на певне призначення змінних остаточного члена.
Для класу C із змінною кінцевого члена V кожен можливий шлях виконання через кожен конструктор C повинен призначати V рівно один раз - якщо не призначити V або призначити V два або більше разів, це призведе до помилки.
Ключове слово для читання лише у C # не має такої гарантії - компілятор із задоволенням залишає члени, які читають лише, без призначення або дозволяють призначити їх кілька разів у конструкторі.
Отже, остаточне та лише для читання (принаймні, стосовно змінних членів), безумовно, не рівнозначні - остаточний набагато суворіший.
Як згадувалося, sealed
це еквівалент final
методів та класів.
Щодо решти, то це складно.
Для static final
полів static readonly
- це найближча річ. Це дозволяє ініціалізувати статичне поле в статичному конструкторі, що досить схоже на статичний ініціалізатор на Java. Це стосується як констант (примітивів і незмінних об'єктів), так і постійних посилань на об'єкти, що змінюються.
const
Модифікатор дуже схожий на константи, але ви не можете встановити їх в статичному конструкторі.
readonly
можна використовувати. Це не рівно, але final
вимагає рівно одного завдання навіть у конструкторі чи ініціалізаторі.Для final
локальної змінної, про яку я знаю, немає жодного еквівалента C # . Якщо вам цікаво, навіщо це комусь потрібно? Ви можете оголосити змінну перед тим, як інше, регістр комутатора тощо. Оголосивши його остаточним, ви дотримуєтесь того, що він призначається не більше одного разу.
Локальні змінні Java загалом повинні бути призначені принаймні один раз перед їх читанням. Якщо гілка не вискочить перед читанням значення, остаточна змінна призначається рівно один раз. Все це перевіряється під час збирання. Для цього потрібен добре поводиться код з меншою відмінністю для помилки.
Підсумований, C # не має прямого еквівалента final
. У той час як Java не має деяких приємних функцій C #, це освіжає мене, як правило, програміста Java, щоб побачити, де C # не вдається доставити еквівалент.
Кінцевий клас Java та метод остаточний -> герметичний. Змінна члена Java - остаточна - для читання лише для константи виконання, const - для константи часу компіляції.
Немає еквівалента для фіналу локальної змінної та аргументу методу
Константи C # оголошуються за допомогою ключового слова const для констант часу компіляції або ключового слова readonly для констант часу виконання. Семантика констант однакова і для мов C # та Java.