मैं विज़ुअल स्टूडियो में "[कुछ घटना] कभी इस्तेमाल नहीं किया गया" कंपाइलर चेतावनियों से कैसे छुटकारा पाऊँ?


93

उदाहरण के लिए, मुझे यह संकलक चेतावनी मिलती है,

इवेंट 'Company.SomeControl.SearchClick' का उपयोग कभी नहीं किया जाता है।

लेकिन मुझे पता है कि इसका उपयोग किया जाता है क्योंकि यह टिप्पणी करना मुझे XAML पृष्ठों की 20 नई चेतावनियों की तरह फेंकता है जो इस घटना का उपयोग करने की कोशिश कर रहे हैं!

क्या देता है? क्या इस चेतावनी से छुटकारा पाने की कोई चाल है?


1
क्या आप कृपया एक उदाहरण पोस्ट कर सकते हैं?
जॉन साउंडर्स

जवाबों:


143

यह 67 की चेतावनी प्रतीत होता है और इस प्रकार से दबाया जा सकता है:

#pragma warning disable 67

इसे जल्द से जल्द (घटना की घोषणा के बाद) जल्द से जल्द बहाल करना न भूलें:

#pragma warning restore 67

हालाँकि, मैं फिर से जाँच करूँगा और सुनिश्चित करूँगा कि आप कहीं न कहीं इस घटना को बढ़ा रहे हैं , न कि केवल इसकी सदस्यता लें । तथ्य यह है कि संकलक 20 चेतावनियों को फैलाता है न कि 20 त्रुटियां जब आप टिप्पणी करते हैं कि घटना भी संदिग्ध है ...

इस चेतावनी के बारे में एक दिलचस्प लेख भी है और विशेष रूप से यह इंटरफेस पर कैसे लागू होता है; "अप्रयुक्त" घटनाओं से निपटने के लिए एक अच्छा सुझाव है। महत्वपूर्ण भाग हैं:

सही जवाब स्पष्ट होना चाहिए कि आप इस घटना से क्या उम्मीद करते हैं, जो इस मामले में, कुछ भी नहीं है:

public event EventHandler Unimportant
{
    add { }
    remove { }
}

यह चेतावनी को स्पष्ट रूप से दबाएगा, साथ ही एक सामान्य घटना के अतिरिक्त संकलक-जनित कार्यान्वयन। और एक और जोड़ा लाभ के रूप में, यह सोचने के लिए प्रेरित करता है कि क्या यह कुछ भी नहीं कार्यान्वयन वास्तव में सबसे अच्छा कार्यान्वयन है। उदाहरण के लिए, यदि यह घटना इतनी महत्वहीन नहीं है क्योंकि यह असमर्थित है, जैसे कि क्लाइंट जो कार्यक्षमता पर भरोसा करते हैं, इसके बिना विफल होने की संभावना है, यह स्पष्ट रूप से समर्थन की कमी का संकेत देना बेहतर हो सकता है और तेजी से फेंकने से विफल हो सकता है अपवाद:

public event EventHandler Unsupported
{
    add { throw new NotSupportedException(); }
    remove { }
}

बेशक, एक इंटरफ़ेस जो अपनी कार्यक्षमता के कुछ हिस्सों के बिना उपयोगी रूप से लागू किया जा सकता है, कभी-कभी यह संकेत होता है कि इंटरफ़ेस आशावादी रूप से सामंजस्यपूर्ण नहीं है और इसे अलग-अलग इंटरफेस में विभाजित किया जाना चाहिए।


ठीक वैसा ही मुझे चाहिए! धन्यवाद! अंतर केवल इतना है कि मैंने अपनी टिप्पणी 67 के पास जोड़ दी थी, इसलिए मुझे पता था कि यह भविष्य में क्या था। यहाँ "बिल्कुल" मैंने जो टाइप किया है ... #pragma चेतावनी अक्षम करें 67 // ईवेंट ने कभी भी सार्वजनिक ईवेंट का उपयोग नहीं किया है RoutedEventHandler SearchClick; #pragma चेतावनी 67
jedmao

12
यह एक बड़ी कड़ी है। धन्यवाद।
मैक्स पामर

यह उपयोगी है; जगह में रखने के लिए नहीं जा रहा है, लेकिन चालू विचार पाने के लिए बस कुछ ...
dudeNumber4

78

यदि आप एक इंटरफ़ेस से किसी घटना को लागू करने के लिए मजबूर हैं, तो आपके कार्यान्वयन की आवश्यकता नहीं है कि आप चेतावनी से बचने के लिए निम्न कार्य कर सकते हैं।

public event EventHandler CanExecuteChanged { add{} remove{} }

यदि मैं ऐसा करता हूं, तो यह बाद में उस फाइल में कहता है जहां मैं करता हूं if(OnCompleteOpenEvent != null) OnCompleteOpenEvent();कि "चालू संदर्भ में ऑनकंप्लीटवेंट मौजूद नहीं है"।
आलमो

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

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

बहुत आसान स्थिति के लिए इस आसान समाधान के लिए बहुत-बहुत धन्यवाद!
M463

14

दूसरा सबसे अच्छा तरीका यह है कि स्पष्ट रूप से कहा जाए कि यदि कोई व्यक्ति इसकी सदस्यता लेने की कोशिश करता है, तो अपवाद को फेंकने से घटना का समर्थन नहीं होता है।

public event RoutedEventHandler SearchClick
{
    add { throw new NotSupportedException(); }
    remove { throw new NotSupportedException(); }
}

इस पर एक प्रकार के रूप में, आप भी छोड़ सकते हैं addऔर removeतरीकों चुपचाप घटना पर सदस्यता की अनदेखी करने के खाली।

सबसे अच्छा समाधान कोड को रिफलेक्टर करना है, संभवत: यदि संभव हो तो घटना की घोषणा को लागू करने वाले तक खींच लें।

अंतिम उपाय के रूप में, आप चेतावनी को निष्क्रिय भी कर सकते हैं

#pragma warning disable 67
public event RoutedEventHandler SearchClick;
#pragma warning restore 67

मैं नहीं देखता कि कैसे अशक्त वस्तुएँ यहाँ प्रासंगिक हैं
vidstige

मुझे पता है कि एक अशक्त वस्तु क्या है, और यह उपयोग मामला अंतिम पैराग्राफ में कवर किया गया है। कृपया पूरे उत्तर को ध्यान से पढ़ें।
vidstige

मुझे पता है कि एक अशक्त वस्तु क्या है। मेरा मानना ​​है कि यह उपयोग मामला मेरे अंतिम पैराग्राफ द्वारा कवर किया गया है।
vidstige

3

आप निम्न कार्य भी कर सकते हैं:

public event EventHandler MyEvent = delegate {}

1

संकलक को स्पष्ट रूप से पता नहीं है कि इसका XAML कोड में उपयोग किया जा रहा है। अपनी घटना की परिभाषा में चेतावनी को दबाने की कोशिश करें।

यह भी सुनिश्चित करें कि आप वास्तव में कहीं न कहीं इस घटना को बढ़ा रहे हैं।


यही मैंने भी सोचा था, इसलिए मैंने XAML कोड को पीछे वाले कोड में स्थानांतरित कर दिया और इसने एक ही चेतावनी दिखाई! और हां, मुझे 100% यकीन है कि इस घटना को कहीं और उठाया जा रहा है। मैं इसे सही देख रहा हूं। यह एक बटन के लिए वायर्ड है।
jedmao

1

आप अलग-अलग चेतावनियों को दबा सकते हैं।

\Program.cs(13,20): warning CS0219: The variable 'foo' is assigned but its value is never used

इस मामले में, CS0219 चर को असाइन किए जाने के बारे में चेतावनी है लेकिन इसका उपयोग नहीं किया गया है। आप या तो / Nowarn: 0219 ध्वज का उपयोग कर सकते हैं, या प्रोजेक्ट के लिए गुण फलक में त्रुटि संख्या जोड़ सकते हैं ("बिल्ड" के तहत, प्रमुख सीएस को हटाने के लिए याद रखें)। इस वर्ग के सभी चेतावनियों को ध्यान में रखें ।


1

या आप <NoWarn>67</NoWarn>अपने प्रोजेक्ट में जोड़ सकते हैं

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <NoWarn>67</NoWarn>
</PropertyGroup>

9
यह पूरी परियोजना में संभावित रूप से अप्रयुक्त घटनाओं के साथ वास्तविक मुद्दों को छिपाने की चेतावनी को अक्षम कर देगा।
vidstige
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.