C # में जावा के फाइनल के बराबर क्या है?


559

जावा final# के C # के बराबर क्या है ?


131
कक्षा के शीर्ष पर एक टिप्पणी "यदि आप इस वर्ग को ओवरराइड करते हैं, तो आपको निकाल दिया जाता है!" (बेशक इसका एक मजाक :)
हेमंत

जवाबों:


860

finalकीवर्ड जावा में कई प्रयोगों है। यह C # sealedऔर readonlyकीवर्ड दोनों से मेल खाता है , यह उस संदर्भ पर निर्भर करता है जिसमें इसका उपयोग किया गया है।

कक्षाएं

उपवर्ग (परिभाषित वर्ग से विरासत) को रोकने के लिए:

जावा

public final class MyFinalClass {...}

सी#

public sealed class MyFinalClass {...}

तरीके

एक virtualविधि के ओवरराइडिंग को रोकें ।

जावा

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

सी#

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

जैसा कि जोआचिम सॉर बताते हैं, दो भाषाओं के बीच एक उल्लेखनीय अंतर यह है कि जावा डिफ़ॉल्ट रूप से सभी गैर-स्थिर तरीकों को virtualचिह्नित करता है , जबकि C # उन्हें चिह्नित करता है sealed। इसलिए, आपको केवल sealedC # में कीवर्ड का उपयोग करने की आवश्यकता है, यदि आप एक विधि के आगे ओवरराइडिंग को रोकना चाहते हैं जिसे स्पष्ट रूप virtualसे आधार वर्ग में चिह्नित किया गया है ।

चर

केवल एक चर को एक बार सौंपा जा सकता है:

जावा

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

सी#

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

एक तरफ ध्यान दें, के प्रभाव के रूप में readonlyकी है कि तैयार किए गए कीवर्ड अलग है constमें उस कीवर्ड readonlyअभिव्यक्ति पर मूल्यांकन किया जाता है क्रम के बजाय संकलन समय है, इसलिए मनमाना भाव की इजाजत दी।


15
मैं जोड़ूंगा कि जावा में सभी गैर-स्थिर तरीके डिफ़ॉल्ट रूप से आभासी हैं। इसलिए C # में रहते हुए आप केवल प्रारंभिक परिभाषा में वर्चुअल को छोड़ सकते हैं, आपको जावा में ओवरराइडिंग से बचने वाले उपवर्गों से बचने के लिए "अंतिम" का उपयोग करने की आवश्यकता होगी
Joachim Sauer

166
अच्छा जवाब - जावा में "फाइनल" का एक और उपयोग है, हालांकि - इसे पुन: प्रस्तुत करने से रोकने के लिए एक स्थानीय चर या विधि पैरामीटर पर। इसका कोई c # प्रत्यक्ष समकक्ष नहीं है।
सर्ग 10

17
readonlyसदस्य चर को कंस्ट्रक्टर्स में संशोधित किया जा सकता है: pastebin.com/AzqzYGiA
पुनरावर्ती

8
यह भी ध्यान दें: यदि आप जावा में अंतिम रूप से एक सदस्य चर घोषित करते हैं, तो कंपाइलर शिकायत करेगा, यदि हर कंस्ट्रक्टर हर कोड पथ में एक मूल्य प्रदान नहीं करता है, जबकि C # केवल उस परिदृश्य में एक चेतावनी जारी करता है जिसमें एक आसानी से सदस्य चर के साथ एक चेतावनी है
MJ

1
@NickolayKondratyev: हां, मेरा उदाहरण निहित था कि आपको किसी अन्य वर्ग से उपवर्ग की आवश्यकता है। आपको वास्तव में इंटरफ़ेस की आवश्यकता नहीं है; यह बहुत अच्छा है, लेकिन अन्यथा यह सही के बारे में दिखता है।
नोल्डोरिन

180

ये संदर्भ पर निर्भर करता है।


1
वास्तव में कोई आवश्यकता नहीं है कि घोषित होने पर एक अंतिम चर सौंपा जाए। 'अंतिम' का अर्थ है कि चर को संदर्भित होने से पहले कुछ कोड पथ द्वारा असाइन किया जाना चाहिए और कोई कोड पथ चर को एक बार से अधिक असाइन करने की अनुमति नहीं देता है। यह उदाहरण चर पर लागू होता है, जिसका अर्थ है कि निर्माणकर्ताओं को चर को स्पष्ट रूप से निर्दिष्ट करना चाहिए।
जे

31
+ For a final local variable or method parameter, there's no direct C# equivalentएक विशाल अंतर के लिए।
डैनियल बी। चैपमैन

1
यदि आप झटपट कर रहे हैं , तो स्थानीय चर के लिए कास्ट का उपयोग किया जा सकता है। यह बराबर नहीं है क्योंकि निश्चित रूप से अंतिम रूप से आपको अलग-अलग घोषित करने और शुरू करने की अनुमति है (और इसलिए अलग-अलग मूल्य हैं), लेकिन सिर्फ मामले में आप नहीं जानते ...
Griknok

3
constकेवल मूल्य प्रकारों पर उपयोग किया जा सकता है। जहां तक ​​मुझे पता है कि स्थानीय संदर्भ प्रकार के लिए एक प्रभावी निरंतर बनाने का कोई तरीका नहीं है।
jocull

2
@jocull स्ट्रिंग्स एकमात्र अपवाद होने के साथ।
रायमुंड क्रमर

46

यहाँ जो सब याद आ रहा है वह है अंतिम सदस्य चर के लिए निश्चित असाइनमेंट की जावा की गारंटी।

अंतिम सदस्य चर V के साथ एक वर्ग C के लिए, C के प्रत्येक निर्माता के माध्यम से हर संभव निष्पादन पथ को एक बार V को असाइन करना होगा - V को असाइन करने या V दो या अधिक बार असाइन करने में विफल होने पर त्रुटि होगी।

C # के आसानी से पढ़े जाने वाले कीवर्ड की ऐसी कोई गारंटी नहीं है - कंपाइलर को रीडओनल सदस्यों को बिना बताए छोड़ने की खुशी से अधिक है या आप उन्हें एक कंस्ट्रक्टर के भीतर कई बार असाइन करने की अनुमति देते हैं।

तो, अंतिम और आसानी से (कम से कम सदस्य चर के संबंध में) निश्चित रूप से समतुल्य नहीं हैं - अंतिम बहुत अधिक सख्त है।


7

जैसा कि उल्लेख किया गया है, विधियों और वर्गों sealedके finalलिए एक बराबर है ।

बाकी के लिए, यह जटिल है।

  • के लिए static finalखेतों, static readonlyनिकटतम बात संभव है। यह आपको स्थिर क्षेत्र में स्थिर क्षेत्र को इनिशियलाइज़ करने की अनुमति देता है, जो जावा में स्थिर इनिशियलाइज़र के समान है। यह स्थिरांक (प्राथमिक और अपरिवर्तनीय वस्तुओं) और उत्परिवर्तित वस्तुओं के निरंतर संदर्भों पर लागू होता है।

    constसंशोधक काफी स्थिरांक के लिए इसी तरह की है, लेकिन आप उन्हें एक स्थिर निर्माता में निर्धारित नहीं कर सकते।

  • किसी ऐसे क्षेत्र पर, जिसे निर्माणकर्ता को छोड़ने के बाद पुन: असाइन नहीं किया जाना चाहिए, readonlyइसका उपयोग किया जा सकता है। हालांकि यह बराबर नहीं है - finalनिर्माणकर्ता या इनिशियलाइज़र में भी बिल्कुल एक असाइनमेंट की आवश्यकता होती है।
  • मेरे द्वारा ज्ञात finalस्थानीय चर के लिए कोई C # समतुल्य नहीं है । यदि आप सोच रहे हैं कि किसी को इसकी आवश्यकता क्यों होगी: आप किसी अन्य से पहले एक चर घोषित कर सकते हैं, स्विच-केस या तो। इसे अंतिम घोषित करके, आप यह लागू करते हैं कि इसे एक बार में सौंपा गया है।

    सामान्य रूप से जावा स्थानीय चर को पढ़ने से पहले कम से कम एक बार सौंपा जाना आवश्यक है। जब तक मान पढ़ने से पहले शाखा कूद नहीं जाती, तब तक एक अंतिम चर बिल्कुल ठीक सौंपा जाता है। यह सब संकलन-समय की जाँच की जाती है। यह एक त्रुटि के लिए कम मार्जिन के साथ अच्छी तरह से व्यवहार कोड की आवश्यकता है।

सारांशित, C # का कोई प्रत्यक्ष समकक्ष नहीं है final। जबकि जावा में C # की कुछ अच्छी विशेषताओं का अभाव है, यह मेरे लिए ताज़ा है क्योंकि ज्यादातर जावा प्रोग्रामर यह देखने के लिए कि C # एक समतुल्य वितरित करने में विफल रहता है।


6

जावा वर्ग अंतिम और विधि अंतिम -> सील। जावा सदस्य चर फाइनल -> क्रमिक स्थिरांक के लिए आसानी से, संकलन समय स्थिरांक के लिए कास्ट।

स्थानीय चर अंतिम और विधि तर्क अंतिम के लिए कोई समकक्ष नहीं है


5

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

C # कॉन्स्टेंट को कॉन्स्टाइल टाइम कॉन्स्टेंट या रनटाइम कॉन्स्टेंट के लिए रीडोनली कीवर्ड के लिए कॉन्स्टेबल कीवर्ड का उपयोग करके घोषित किया जाता है। स्थिरांक का शब्दार्थ C # और Java दोनों भाषाओं में समान है।


0

सील


8
जवाब का केवल एक हिस्सा है क्योंकि यह संदर्भ पर निर्भर करता है और एक स्पष्टीकरण और / या उदाहरणों को जोड़ने से मदद की ज़रूरत में उन लोगों के लिए यह बहुत अधिक पचाने योग्य हो जाएगा
रूण FS
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.