C # 'da Java finalinin eşdeğeri nedir?


Yanıtlar:


861

finalAnahtar kelime Java birkaç kullanımları vardır. Kullanılan bağlama bağlı olarak, C # ' da sealedve readonlyanahtar kelimelere karşılık gelir .

Sınıflar

Alt sınıflamayı (tanımlanan sınıftan miras) önlemek için:

Java

public final class MyFinalClass {...}

C #

public sealed class MyFinalClass {...}

Yöntemler

Bir virtualyöntemin geçersiz kılınmasını önleyin .

Java

public class MyClass
{
    public final void myFinalMethod() {...}
}

C #

public class MyClass : MyBaseClass
{
    public sealed override void MyFinalMethod() {...}
}

Joachim Sauer'ın işaret ettiği gibi, buradaki iki dil arasında dikkate değer bir fark, Java'nın varsayılan olarak tüm statik olmayan yöntemleri olduğu gibi virtualişaretlemesi, C # ise bunları olarak işaretlemesidir sealed. Bu nedenle, yalnızca temel sınıfta sealedaçıkça işaretlenmiş bir yöntemin geçersiz kılınmasını durdurmak istiyorsanız , yalnızca C # ' da anahtar kelimeyi kullanmanız gerekir virtual.

Değişkenler

Bir değişkenin yalnızca bir kez atanmasına izin vermek için:

Java

public final double pi = 3.14; // essentially a constant

C #

public readonly double pi = 3.14; // essentially a constant

Bir yan not olarak, readonlyanahtar kelimenin etkisi const, readonlyifadenin derleme zamanı yerine çalışma zamanında değerlendirilmesinden ve dolayısıyla rasgele ifadelere izin verilmesinden anahtar kelimeden farklıdır .


15
Java'daki tüm statik olmayan yöntemlerin varsayılan olarak sanal olduğunu eklerim. Bu yüzden C # 'da ilk tanımda sanal olanı dışarıda bırakabilirsiniz, Java'da geçersiz kılınan alt sınıfları önlemek için "final" i kullanmanız gerekir
Joachim Sauer

166
iyi cevap - yine de java "son" kullanımı vardır - yeniden atanmasını önlemek için yerel bir değişken veya yöntem parametresi. Bunun c # doğrudan eşdeğeri yoktur.
serg10

17
readonlyÜye değişkeni olabilir kurucular değiştirilebilir: pastebin.com/AzqzYGiA
özyinelemeli

8
Ayrıca dikkat: Bir üye değişkeni Java'da son olarak bildirirseniz, her kurucu her kod yolunda bir değer atamazsa, derleyici şikayette bulunurken, C # bu senaryoda salt okunur bir üye değişkeniyle yalnızca bir uyarı verir
Mene

1
@NickolayKondratyev: Evet, örneğim başka bir sınıftan alt sınıfta olmanız gerektiği anlamına geliyordu. Arayüze gerçekten ihtiyacınız yok; bu gereksiz, ama aksi halde doğru görünüyor.
Noldorin

180

Bu koşullara bağlıdır.


1
Aslında, bir nihai değişkenin bildirildiğinde atanmasına gerek yoktur. 'final', değişkene referans verilmeden önce bazı kod yollarıyla atanması gerektiği anlamına gelir ve hiçbir kod yolu değişkenin birden fazla atanmasına izin vermez. Bu, örnek değişkenler için geçerlidir; bu, gerçekte kurucuların değişkeni açıkça ataması gerektiği anlamına gelir.
Jay

31
+ For a final local variable or method parameter, there's no direct C# equivalentbüyük bir ayrım için.
Daniel B. Chapman

1
Eğer varsa başlatmasını , const yerel değişken için kullanılabilir. Eşdeğer değil, çünkü elbette final ayrı ayrı beyan ve başlatmanıza izin veriyor (ve bu yüzden farklı değerler var), ancak bilmiyorsanız ...
Griknok

3
constyalnızca değer türlerinde kullanılabilir. Bildiğim kadarıyla yerel bir referans türü için etkili bir sabit oluşturmanın bir yolu yok.
jocull

2
@jocull Dizeler tek istisnadır.
Raimund Krämer

46

Buradaki herkesin eksik olduğu şey Java'nın son üye değişkenler için kesin atama garantisidir.

Son üye değişkeni V olan bir sınıf C için, her C kurucusundaki olası her yürütme yolu, V'yi tam olarak bir kez atamalıdır - V'yi atamamak veya V'yi iki veya daha fazla kez atamak hataya neden olur.

C # 's salt okunur anahtar sözcüğü böyle bir garanti yoktur - derleyici salt okunur üyeleri atanmamış bırakmak veya bir kurucu içinde birden çok kez atamak için izin vermekten mutluluk duyar.

Dolayısıyla, final ve salt okunur (en azından üye değişkenlere göre) kesinlikle eşdeğer değildir - final çok daha katıdır.


7

Belirtildiği gibi, yöntemler ve sınıflar için sealedeşdeğerdir final.

Geri kalanlara gelince, karmaşık.

  • İçin static finalalanlar, static readonlymümkün olan en yakın şeydir. Statik alanı, Java'daki statik başlatıcıya oldukça benzer bir statik yapıcıda başlatmanıza izin verir. Bu hem sabitler (ilkel ve değişmez nesneler) hem de değişebilir nesnelere sürekli referanslar için geçerlidir.

    constDeğiştirici sabitleri için oldukça benzer, ancak statik yapıcı bunları olamaz.

  • Kurucudan ayrıldıktan sonra yeniden atanmaması gereken bir alanda readonlykullanılabilir. Yine de eşit değildir - finalyapıcı veya başlatıcıda bile tam olarak bir ödev gerektirir.
  • finalBildiğim bir yerel değişken için C # eşdeğeri yok . Herhangi birinin neden buna ihtiyacı olduğunu merak ediyorsanız: if-else, switch-case vb. Öncesinde bir değişken bildirebilirsiniz . Nihai olduğunu beyan ederek, en fazla bir kez atandığını zorunlu tutuyorsun.

    Java yerel değişkenlerinin genel olarak okunmadan önce en az bir kez atanmaları gerekir. Şube, değer okunmadan önce atlamadığı sürece, son değişken tam olarak bir kez atanır. Tüm bunlar derleme zamanı kontrol edilir. Bu, bir hata için daha az marj ile iyi davranılmış bir kod gerektirir.

Özetle, C # 'nin doğrudan eşdeğeri yoktur final. Java, C # 'ın bazı güzel özelliklerinden yoksun olsa da, çoğunlukla bir Java programcısı olarak C #' ın eşdeğer bir ürünü sunmadığını görmek benim için ferahlatıcı.


6

Java sınıfı finali ve yöntem finali -> mühürlü. Java üye değişkeni final -> çalışma zamanı sabiti için salt okunur, derleme zamanı sabiti için sabit.

Yerel Değişken finali ve yöntem bağımsız değişkeni finali için eşdeğer değil



0

Mühürlü


8
Bu cevabın sadece bir kısmı bağlama bağlı olduğu ve bir açıklama ve / veya örnek eklediği için yardıma ihtiyacı olanlar için çok daha sindirilebilir hale gelecektir
Rune FS
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.