2009-03-19 23 views
21

आज, मुझे विरासत कोड में कुछ मिला। यह एक समारोह के लिए "स्थैतिक नया" है। यह इस तरह दिख रहा है।फ़ंक्शन के लिए "स्थैतिक नया" संशोधक का बिंदु क्या है?

class Foo 
{ 
    public static void Do() 
    { 
     Console.WriteLine("Foo.Do"); 
    } 
} 

class Bar: Foo 
{ 
    public static new void Do() 
    { 
     Console.WriteLine("Bar.Do"); 
    } 
} 

मैं कक्षा बार में करो विधि के लिए स्थिर नई संशोधक समझ में नहीं आता। सी # में, स्थैतिक विधि केवल ऑब्जेक्ट नाम के बजाय कक्षा के नाम से बुलाया जा सकता है। इसलिए, मुझे नहीं लगता कि "नया" होने के बीच कोई अंतर है और नहीं।

आम तौर पर, अगर कुछ वाक्यविन्यास अनावश्यक है, तो सी # बस इलाज करें यह त्रुटि है। किसी को भी इस बारे में कोई विचार है कि क्यों सी # ऐसे वाक्यविन्यास की अनुमति देता है?

उत्तर

37

होना चाहिए आप नई अपने कोड से आपको मिल को निकाल देते हैं:

चेतावनी CS0108: 'Bar.Do()' विरासत में सदस्य 'Foo.Do()' छुपाता है। छिपाने के इरादे से नए कीवर्ड का प्रयोग करें।

सी # संकलक केवल आपके चेतावनी दी है कि यदि आपको स्वयं का इरादा नहीं था कर रही हो सकता है आप इसकी पुष्टि आप जानते हैं कि आप क्या कर रहे नई कीवर्ड प्रविष्ट करना पूछता है। चेतावनी को दबाने के अलावा, इसका कोई अन्य प्रभाव नहीं है।

+12

यह ध्यान देने योग्य है कि यह _only_ चेतावनी को दबा देता है। कोई अन्य प्रभाव नहीं। –

+0

अच्छा बिंदु। मैंने एवर को जोड़ा। –

+4

जबकि यह केवल चेतावनी को दबाता है, यह इरादा स्पष्ट करता है (किसी भी भ्रम से बचने के लिए), मेरा उत्तर – eglasius

7

, यह स्पष्ट करने के लिए this

public class BaseC 
{ 
    public static int x = 55; 
    public static int y = 22; 
} 

public class DerivedC : BaseC 
{ 
    // Hide field 'x'. 
    new public static int x = 100; 

    static void Main() 
    { 
     // Display the new value of x: 
     Console.WriteLine(x); 

     // Display the hidden value of x: 
     Console.WriteLine(BaseC.x); 

     // Display the unhidden member y: 
     Console.WriteLine(y); 
    } 
} 
/* 
Output: 
100 
55 
22 
*/ 

आपका उदाहरण पर एक नजर है,

public class Foo 
{ 
    public static void Do() {} 
} 
public class Bar :Foo 
{ 
    public new static void Do() {} 
} 
4

आपके उदाहरण में, द्वितीय श्रेणी बार फू से प्राप्त नहीं होता है। यह एक टाइपो प्रतीत होता है क्योंकि यह अन्यथा समझ में नहीं आता है।

इसे एक टाइपो मानते हुए, "नया" संशोधक स्पष्ट रूप से फ़ंक्शन Do() के बेस क्लास संस्करण को छुपाता है। इसका मतलब है कि Do() विधि का व्युत्पन्न संस्करण प्रभावी रूप से बेस क्लास संस्करण को प्रतिस्थापित करता है।

यहां "नया" का उपयोग करके दस्तावेजों को तथ्य यह है कि विरासत विधि Do() के बेस क्लास संस्करण के प्रतिस्थापन के रूप में लक्षित है।

अधिक जानकारी के लिए new Modifier (C#)

+0

यहां [नए संशोधक] का अद्यतन दस्तावेज है (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/new-modifier)। – zodo

10

केवल बाहरी कॉल करने के लिए लागू होता है कि देखते हैं। याद रखें कि आप आधार वर्ग की एक स्थिर विधि कॉल कर सकते हैं, तो कुछ इस तरह मान्य है:

class Foo 
{ 
    public static void Do() { Console.WriteLine("Foo.Do"); } 
} 
class Bar : Foo // :Foo added 
{ 
    public static void Something() 
    { 
     Do(); 
    } 
} 

यही कारण है कि चेतावनी आपको बताता है कि नए डाल करने के लिए, आप जब यह कर भी भ्रम से बचने के लिए चाहते हैं:

class Foo 
{ 
    public static void Do() { Console.WriteLine("Foo.Do"); } 
} 
class Bar : Foo // :Foo added 
{ 
    public static void Something() 
    { 
     Do(); 
    } 
    public static new void Do() { Console.WriteLine("Bar.Do"); } 
} 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^