"सी कभी इस्तेमाल नहीं किया जाता है" को दबाने और "सी में चेतावनी" करने के लिए कभी नहीं सौंपा गया है


107

मेरे पास C # प्रोजेक्ट में एक HTTPSystemDefinitions.cs फ़ाइल है जो मूल रूप से प्रबंधित कोड द्वारा खपत के लिए पुराने विंडोज़ ISAPI का वर्णन करती है।

इसमें ISAPI से संबंधित संरचनाओं का पूरा सेट शामिल है, जो सभी या कोड द्वारा खपत नहीं हैं। संकलन पर इन संरचनाओं के सभी क्षेत्र के सदस्य निम्नलिखित की तरह एक चेतावनी का कारण बन रहे हैं: -

चेतावनी फ़ील्ड 'UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.SetHeader' को कभी भी असाइन नहीं किया गया है, और हमेशा इसका डिफ़ॉल्ट मान शून्य होगा

या

चेतावनी फ़ील्ड 'UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.HttpStatus' का उपयोग कभी नहीं किया जाता है

क्या इन्हें निष्क्रिय किया जा सकता है #pragma warning disable? यदि ऐसा है तो संबंधित त्रुटि संख्या क्या होगी? अगर वहाँ कुछ और नहीं मैं कर सकता हूँ? इस बात को ध्यान में रखें कि मैं केवल इस फाइल के लिए क्या कर रहा हूं, इसका महत्वपूर्ण यह है कि मुझे अन्य फ़ाइलों से आने वाली चेतावनी जैसे मिलते हैं।

संपादित करें

उदाहरण संरचना: -

struct HTTP_FILTER_PREPROC_HEADERS
{
    //
    //  For SF_NOTIFY_PREPROC_HEADERS, retrieves the specified header value.
    //  Header names should include the trailing ':'.  The special values
    //  'method', 'url' and 'version' can be used to retrieve the individual
    //  portions of the request line
    //

    internal GetHeaderDelegate GetHeader;
    internal SetHeaderDelegate SetHeader;
    internal AddHeaderDelegate AddHeader;

    UInt32  HttpStatus;               // New in 4.0, status for SEND_RESPONSE
    UInt32  dwReserved;               // New in 4.0
}

क्या आप उन क्षेत्रों की घोषणा दिखा सकते हैं, या यों कहें कि वे जिस संरचना में हैं? अर्थात। एक उदाहरण दें।
लेसे वी। कार्लसन

11
यदि ये अंतर परिभाषाएं हैं, तो आम तौर पर आप [StructLayout(LayoutKind.Sequential)]यह सुनिश्चित करने के लिए कहेंगे कि मेमोरी लेआउट सही है (वर्तमान कार्यान्वयन में यह इस विशेषता के बिना भी होगा, लेकिन AFAIK इसकी गारंटी नहीं है)। अगर मुझे सही तरीके से याद है, तो C # कंपाइलर इस विशेषता की उपस्थिति का पता लगाता है और स्वचालित रूप से उन चेतावनियों को दबा देता है क्योंकि यह जानता है कि इंटरोप के लिए फ़ील्ड्स होना चाहिए। (मैं इस बारे में गलत हो सकता है, इसलिए उत्तर के बजाय टिप्पणी के रूप में पोस्ट कर रहा हूं)।
ग्रेग बीच

@Greg: यह उपयोगी जानकारी है जिसकी मैं जाँच करूँगा कि मैं उन्हें दबाने के बजाय चेतावनी उत्पन्न नहीं करूँगा।
एंथनीवजोन 8

1
उपयोग करने के लिए +1 StructLayout। यह चेतावनियों को दबाने से ज्यादा साफ है।
डीनना

@GregBeech आप सही हैं! अभी भी VS2017 पर .NET मानक परियोजनाओं के लिए लागू होता है।
zwcloud

जवाबों:


195

हां, इन्हें दबाया जा सकता है।

आम तौर पर, मैं चेतावनियों को दबाने का विरोध कर रहा हूं, लेकिन इस मामले में, इंटरोप के लिए उपयोग किए जाने वाले स्ट्रक्चर्स को बिल्कुल कुछ फ़ील्ड्स की आवश्यकता होती है, भले ही आप कभी भी उनका उपयोग न करें (या नहीं कर सकते), इसलिए इस मामले में मुझे लगता है कि इसे उचित ठहराया जाना चाहिए ।

आम तौर पर, उन दो चेतावनियों को दबाने के लिए, आप अपमानजनक कोड को ठीक कर देंगे। पहला ("... कभी उपयोग नहीं किया जाता है") आमतौर पर कोड के पुराने संस्करणों से बचे हुए की एक गंध है। शायद कोड हटा दिया गया था, लेकिन खेतों ने पीछे छोड़ दिया।

दूसरा आमतौर पर गलत तरीके से उपयोग किए जाने वाले क्षेत्रों के लिए एक कोड-गंध है। उदाहरण के लिए, आप गलत तरीके से संपत्ति के नए मूल्य को वापस संपत्ति में ही लिख सकते हैं, कभी समर्थन क्षेत्र पर नहीं लिख सकते।


" फ़ील्ड XYZ का उपयोग कभी नहीं किया जाता है " के लिए चेतावनी को दबाने के लिए , आप ऐसा करते हैं:

#pragma warning disable 0169
... field declaration
#pragma warning restore 0169

" फ़ील्ड XYZ को कभी भी असाइन नहीं किया गया है, और इसके डिफ़ॉल्ट मान XX के लिए चेतावनी को दबाने के लिए , आप ऐसा करते हैं:

#pragma warning disable 0649
... field declaration
#pragma warning restore 0649

ऐसी चेतावनी संख्याओं को स्वयं खोजने के लिए (अर्थात मैं 0169 और 0649 का उपयोग करना कैसे जानता था), आप यह करते हैं:

  • कोड को सामान्य रूप में संकलित करें, इससे विज़ुअल स्टूडियो में आपकी त्रुटि सूची में कुछ चेतावनी जुड़ जाएगी
  • आउटपुट विंडो पर स्विच करें, और आउटपुट बनाएँ, और एक ही चेतावनी के लिए शिकार करें
  • संबंधित संदेश से 4-अंकीय चेतावनी कोड की प्रतिलिपि बनाएँ, जो इस तरह दिखना चाहिए:

    C: \ Dev \ VS.NET \ ConsoleApplication19 \ ConsoleApplication19 \ Program.cs (10,28): CS 0649 चेतावनी : फ़ील्ड 'ConsoleApplication19.Program.dwReserved' को कभी भी असाइन नहीं किया गया है, और हमेशा इसका डिफ़ॉल्ट मान 0 होगा


चेतावनी : द्वारा टिप्पणी के अनुसार @Jon हैना , शायद कुछ चेतावनियों के क्रम में इस बात के लिए, इस सवाल-जवाब के भविष्य ढूँढ़ने वाले के लिए है।

  • सबसे पहले, और सबसे महत्वपूर्ण, एक चेतावनी को दबाने का कार्य सिर दर्द के लिए गोलियां निगलने के समान है। निश्चित रूप से, यह कभी-कभी करने के लिए सही बात हो सकती है, लेकिन यह कैच-ऑल समाधान नहीं है। कभी-कभी, सिरदर्द एक वास्तविक लक्षण है जिसे आपको चेतावनियों के साथ ही नहीं करना चाहिए। यह हमेशा सबसे अच्छा है कि उनके निर्माण को ठीक करने के बजाय, उनके निर्माण को ठीक करने के बजाय चेतावनियों को ठीक करने की कोशिश करें।
  • यह कहते हुए कि, अगर आपको चेतावनी को दबाने की जरूरत है, तो ऊपर दिए गए पैटर्न का पालन करें। पहली कोड लाइन, बाकी फ़ाइल के लिए#pragma warning disable XYZK चेतावनी को अक्षम कर देती है , या कम से कम तब तक जब तक कि एक समान नहीं मिलती है। इन चेतावनियों को अक्षम करने वाली पंक्तियों की संख्या कम से कम करें। ऊपर दिया गया पैटर्न सिर्फ एक लाइन के लिए चेतावनी को निष्क्रिय करता है।#pragma warning restore XYZK
  • इसके अलावा, जैसा कि जॉन का उल्लेख है, आप ऐसा क्यों कर रहे हैं के बारे में एक टिप्पणी एक अच्छा विचार है। बिना किसी कारण के किए जाने पर चेतावनी को अक्षम करना निश्चित रूप से एक कोड-गंध है, और एक टिप्पणी भविष्य के अनुचर को समय बिताने से रोक देगी या तो यह सोचकर कि आपने ऐसा क्यों किया, या यहां तक ​​कि इसे हटाकर और चेतावनी को ठीक करने की कोशिश कर रहा है।

9
मैं ऊपर दिए गए उत्तर की सिफारिश करूंगा, कि अक्षम का दायरा जितना संभव हो उतना छोटा हो (जहां कहीं भी यह उपयोगी है वहां इसे निष्क्रिय करने से बचें) और हमेशा एक टिप्पणी के साथ अक्षम करने के साथ कि आप क्यों अक्षम कर रहे हैं, जैसे //exists for interopकि ये मामला।
जॉन हैना

बहुत बहुत धन्यवाद। इसका एक विचित्र विकल्प यह है कि VS में त्रुटि सूची विंडो में इन संख्याओं के लिए एक कॉलम शामिल नहीं है।
एंथनीवजोन

2
जैसा कि जॉन कहते हैं, "क्यों" टिप्पणी करना बहुत महत्वपूर्ण है। इसके अलावा, मैं आम तौर पर टिप्पणी के लिए चेतावनी संदेश के पाठ का कम से कम हिस्सा जोड़ देता हूं जैसे कि // दमन "चेतावनी ... को कभी नहीं सौंपा गया है।" भविष्य को बचाने चेतावनी कोड को देखने के लिए होने की झुंझलाहट को बनाए रखता है - आखिरकार, यह आप हो सकता है!
टॉम बुशेल

1
यह तुरंत स्पष्ट नहीं है लेकिन आप CTRL + F के माध्यम से आउटपुट विंडो में फाइंड का उपयोग कर सकते हैं, "वार्निंग" में टाइप करें, "फाइंड ऑल" पर क्लिक करें और हर वार्निंग जल्दी से प्राप्त करें, जिसमें चेतावनी नंबर प्रदर्शित हों। [StructLayout(LayoutKind.Sequential)]इस सवाल पर ग्रेग बीच की टिप्पणी के अनुसार यह विशेषता बहुत बेहतर इंटरॉप को संभालती है।
बजे रयान बुदिकॉम

2
यह कहते हुए कि यूनाइट 3 डी उपयोगकर्ताओं के लिए, चेतावनी संख्या निजी क्षेत्रों के लिए 0414 और स्थानीय चर के लिए 0219 हैं, 169 नहीं (जो चेतावनी को बहाल करने में असमर्थ के बारे में चेतावनी फेंकता है)।
Draco18s अब SE

14

इन चेतावनियों को ठीक करने के लिए एक और "समाधान" है संरचना बनाना public। चेतावनी तब जारी नहीं की जाती है क्योंकि संकलक यह नहीं जान सकता है कि विधानसभा के बाहर खेतों का उपयोग (सौंपा) किया जा रहा है या नहीं।

उस ने कहा, "इंटरोप" घटक आमतौर पर सार्वजनिक नहीं होना चाहिए, बल्कि internalया private


2
अच्छा, इस छिपाने चेतावनी करता है ... लेकिन इस तरह के एक स्थापित करने structके रूप में publicअधिक होने की संभावना चेतावनी हम नकाब की कोशिश कर रहे से एक गलती हो रहा है। (आपको आंतरिक कार्यान्वयन के लिए उपयोग किए जाने वाले प्रकारों को संभवतः अनावश्यक रूप से उजागर नहीं करना चाहिए और सार्वजनिक क्षेत्रों के प्रकार संभवतः सार्वजनिक API से संबंधित नहीं हैं)। बस अपनी सलाह को सुदृढ़ करने के लिए कि इस प्रकार के "बल्कि " internalया private;-) होना चाहिए ।
बिंकी जू

भयानक धन्यवाद - यह वही है जो मुझे चाहिए था। मैं उपयोग कर रहा हूं JsonConvert.DeserializeObjectऔर मैं एक सार्वजनिक वर्ग में शामिल हो रहा हूं, जिसमें अभी-अभी सारी संपत्तियां उजागर हुई हैं, ताकि मुझे पता चले कि क्या लौटाया जाएगा। बस इसे एक सार्वजनिक वर्ग बनाना जो सभी सार्वजनिक तार के साथ खाली है, अच्छा शॉर्ट कोड है और अब कोई चेतावनी नहीं है। हो सकता है कि डायनामिक क्लास का उपयोग करना बेहतर होगा क्योंकि आपको स्पष्ट रूप से यह बताने की ज़रूरत नहीं है कि ऐरे में क्या है, लेकिन मुझे लगता है कि यह ऑब्जेक्ट का उपयोग करने की उम्मीद करने वाले किसी भी व्यक्ति के लिए एक अच्छा संदर्भ होगा।
user1274820

6

मुझे वीएस को कार्यान्वयन कंकाल बनाने के लिए मिला System.ComponentModel.INotifyPropertyChangedऔर घटनाओं को उन क्षेत्रों के रूप में लागू किया गया, जिन्होंने CS0067 चेतावनियों को ट्रिगर किया।

स्वीकृत उत्तर में दिए गए समाधान के विकल्प के रूप में मैंने खेतों को संपत्तियों में बदल दिया और चेतावनी गायब हो गई

इसका मतलब यह है कि संपत्ति की घोषणा के बाद सिंटैक्स चीनी को एक फ़ील्ड प्लस गेट्टर और / या सेटर विधियों (मेरे मामले में जोड़ें / हटाएं) में संकलित किया जाता है जो क्षेत्र का संदर्भ देते हैं। यह संकलक और चेतावनियों को संतुष्ट करता है:

struct HTTP_FILTER_PREPROC_HEADERS
{
    //
    //  For SF_NOTIFY_PREPROC_HEADERS, retrieves the specified header value.
    //  Header names should include the trailing ':'.  The special values
    //  'method', 'url' and 'version' can be used to retrieve the individual
    //  portions of the request line
    //

    internal GetHeaderDelegate GetHeader {get;set;}
    internal SetHeaderDelegate SetHeader { get; set; }
    internal AddHeaderDelegate AddHeader { get; set; }

    UInt32 HttpStatus { get; set; }               // New in 4.0, status for SEND_RESPONSE
    UInt32 dwReserved { get; set; }               // New in 4.0
}

आपका समाधान चेतावनी को अक्षम करने की तुलना में बहुत ही सुंदर है, लेकिन यह कुछ फ़ील्ड-केवल विशेषताओं, जैसे कि MarshalAsAttribute के साथ हस्तक्षेप कर सकता है।
हुबेज़ा

1
जानकारी: इस स्थिति में उत्पन्न वास्तविक निजी क्षेत्रों में "अजीब" नाम हो सकते हैं <GetHeader>k__BackingField, जैसे कि इस्तेमाल किए गए C # संकलक के विवरण के आधार पर।
जेपी स्टिग नीलसन

1

C / C ++ उपयोगकर्ताओं को (void)var;अप्रयुक्त चर चेतावनियों को दबाना होगा। मैंने अभी-अभी पता लगाया है कि आप सी # में अप्रयुक्त चर चेतावनियों को बिटवाइज़ ऑपरेटरों के साथ दबा सकते हैं:

        uint test1 = 12345;
        test1 |= 0; // test1 is still 12345

        bool test2 = true;
        test2 &= false; // test2 is now false

VS2010 C # 4.0 और मोनो 2.10 संकलक में दोनों अभिव्यक्त अप्रयुक्त परिवर्तनीय चेतावनियों का उत्पादन नहीं करते हैं।


4
के लिए काम करता है uint, लेकिन अन्य प्रकारों के लिए नहीं, जैसा कि Exception। क्या आप सी / सी ++ के बराबर एक सामान्य चाल जानते हैं var;?
मनुवेल

1
भविष्य से @manuell नमस्ते! आप error.ToString();प्रकार के एक चर के लिए उपयोग कर सकते हैंException
Sv443

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