C # - Assert () विधि क्या करती है? क्या यह अभी भी उपयोगी है?


156

मैं ब्रेकपॉइंट्स के साथ डिबगिंग कर रहा हूं और मुझे एस्टर कॉल का एहसास है? मुझे लगा कि यह केवल यूनिट परीक्षणों के लिए था। यह ब्रेकपॉइंट से अधिक क्या करता है? चूंकि मैं ब्रेकपॉइंट कर सकता हूं, इसलिए मुझे एस्टर का उपयोग क्यों करना चाहिए?


9
वैसे, यदि आप अभिरुचि में रुचि रखते हैं तो आपको निश्चित रूप से कोड कॉन्ट्रैक्ट में तल्लीन करना चाहिए ।
मास्टरमैस्ट

के संभावित डुप्लिकेट stackoverflow.com/questions/129120/...
माइकल Freidgeim

जवाबों:


200

डिबग संकलन में, Assertएक बूलियन स्थिति में एक पैरामीटर के रूप में लेता है, और स्थिति गलत होने पर त्रुटि संवाद दिखाता है। यदि स्थिति सही है तो कार्यक्रम बिना किसी रुकावट के आगे बढ़ता है।

यदि आप रिलीज़ में संकलित करते हैं, तो सभी Debug.Assertस्वतः ही बाहर हो जाते हैं।


12
मैं डीबग का समान व्यवहार कैसे प्राप्त कर सकता हूं। रिलीज़ मोड में सम्मिलित करें?
हमीश ग्रुबीजन

15
ट्रेस.एजर्स रिलीज़ मोड के लिए जाहिरा तौर पर refs: msdn.microsoft.com/en-us/library/… msdn.microsoft.com/en-us/library/e63efys0.aspx
टिम एबेल

8
@ HamishGrubijan और आप Debug.Assertरिलीज़ मोड में क्यों चाहेंगे ?
कैमिलो मार्टिन

25
IMO, रिलीज़ कोड से दावा छोड़ने के लिए डॉक करते समय लाइफबोट ड्रिल का आयोजन करने और फिर जब आप पालते हैं तो लाइफबोट को पीछे छोड़ते हैं। :)
क्रिस

113
मुखर एक जीवनरक्षक नौका नहीं हैं, वे एक हिमखंड पहचान प्रणाली हैं। चूंकि उपयोगकर्ता जहाज को स्टीयरिंग नहीं कर रहा है, रिलीज कोड में एक अभिकर्ता सिर्फ उन्हें बताता है कि वे बर्बाद हैं; यह उन्हें हिमशैल से बचने नहीं देता।
स्टीफन

97

से कोड पूरा

8 रक्षात्मक प्रोग्रामिंग

Sert.२ जोर

एक ऐसा कोड है जो विकास के दौरान उपयोग किया जाता है- आमतौर पर एक रूटीन या मैक्रो- जो किसी प्रोग्राम को चलाने के साथ ही उसे चेक करने की अनुमति देता है। जब एक दावा सही है, तो इसका मतलब है कि सब कुछ उम्मीद के मुताबिक चल रहा है। जब यह गलत है, इसका मतलब है कि यह कोड में एक अप्रत्याशित त्रुटि का पता चला है। उदाहरण के लिए, यदि सिस्टम मानता है कि ग्राहक-सूचना फ़ाइल में कभी भी 50,000 से अधिक रिकॉर्ड नहीं होंगे, तो प्रोग्राम में यह दावा किया जा सकता है कि रिकॉर्ड की संख्या 50,000 से कम या उसके बराबर है। जब तक रिकॉर्ड की संख्या 50,000 से कम या उसके बराबर है, तब तक दावा चुप हो जाएगा। यदि यह 50,000 से अधिक रिकॉर्ड का सामना करता है, तो, यह जोर से "जोर" देगा कि कार्यक्रम में कोई त्रुटि है।

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

आम तौर पर एक तर्क में दो तर्क होते हैं: एक बूलियन अभिव्यक्ति जो उस धारणा का वर्णन करती है जो कि सच है और यह प्रदर्शित करने के लिए संदेश है कि नहीं है।

(...)

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


2
सॉलिड कोड लिखने वाली पुस्तक में भी मुखर के उपयोग के बारे में एक महान चर्चा है। वे एक महान डिबगिंग उपकरण हैं!
झुरोपा

39

आपको इसे ऐसे समय के लिए उपयोग करना चाहिए जब आप चर की जाँच करने के लिए कोड की हर छोटी लाइन को तोड़ना नहीं चाहते हैं, लेकिन आप कुछ प्रकार की प्रतिक्रिया प्राप्त करना चाहते हैं यदि कुछ परिस्थितियाँ मौजूद हैं, उदाहरण के लिए:

Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");

यदि मैं आपके ऊपर समान कोड की एक पंक्ति जोड़ता हूं, तो मेरा प्रोग्राम चलाने से निम्न त्रुटि मिलती है: "त्रुटि CS0103: वर्तमान संदर्भ में 'डीबग' नाम मौजूद नहीं है"। क्या मुझे इसे काम करने के लिए किसी प्रकार के कथन का उपयोग करने की आवश्यकता है?
जोश डेसमंड

4
@JoshDesmondSystem.Diagnostics
Sinjai

16

Assert भी आपको Microsoft के UI डिज़ाइन कौशल पर चकल्लस करने का एक और अवसर प्रदान करता है। मेरा मतलब है: तीन बटन एबोर्ट, रिट्री, इग्नोर के साथ एक संवाद, और टाइटल बार में उनकी व्याख्या कैसे करें!


3
एबोर्ट / रिट्री / इग्नोर क्लासिक है! क्या यह दावा किया गया था कि यह हर समय प्रदर्शित करने के लिए विंडोज 3.1 का उपयोग करता था?
devlord

मूल रूप से ऐसा इसलिए है क्योंकि यह एक मैसेजबॉक्स का उपयोग करता है, जैसा कि आप कहते हैं कि विंडोज़ 3.1 पर तारीखें वापस आती हैं, और केवल पूर्वनिर्धारित बटन लेबल होते हैं। तो आप समझ सकते हैं कि हैक के बारे में क्यों आया था, लेकिन ऐसा नहीं है कि यह अभी भी 2008 में क्यों है!
जो

4
@ जो यह कुछ ऐसा है जो केवल डेवलपर्स द्वारा देखा जाना चाहिए जो उपयोगकर्ताओं को समाप्त नहीं करता है इसलिए इसे अपडेट करना संभवतः एक बहुत कम प्राथमिकता वाला आइटम है। यदि यह परेशान करता है तो आप डिबग ललिस्टर्स या ट्रेस लिस्ट्रेन्स को संशोधित कर सकते हैं। डिफ़ॉल्ट हैंडलर को एक के साथ बदलने के लिए जो आपको कुछ भी नहीं चाहिए।
दान

5
और अच्छी तरह से यह अब 2019 है और एक ही डायलॉग बॉक्स / बटन अभी भी यहाँ हैं!
बोके

10

मुखर आपको अपने कोड में एक शर्त (पद या पूर्व) लागू करने की अनुमति देता है। यह आपके इरादों का दस्तावेजीकरण करने का एक तरीका है और यदि आपका इरादा पूरा नहीं हुआ है, तो एक संवाद के साथ आपको सूचित करें।

ब्रेकपॉइंट के विपरीत, एस्टर आपके कोड के साथ जाता है और इसका उपयोग आपके इरादे के बारे में अतिरिक्त विवरण जोड़ने के लिए किया जा सकता है।


10

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

Debug.Assert(x > 2)

यदि आप एक "डिबग" बिल्ड चला रहे हैं तो केवल एक ब्रेक को ट्रिगर करेंगे, रिलीज बिल्ड नहीं। यहाँ इस व्यवहार का एक पूरा उदाहरण है


10

सबसे पहले Assert()विधि Traceऔर Debugकक्षाओं के लिए उपलब्ध है ।
Debug.Assert()केवल डिबग मोड में निष्पादित हो रहा है।
Trace.Assert()डिबग और रिलीज़ मोड में चल रहा है।

यहाँ एक उदाहरण है:

        int i = 1 + 3;
        // Debug.Assert method in Debug mode fails, since i == 4
        Debug.Assert(i == 3);
        Debug.WriteLine(i == 3, "i is equal to 3");

        // Trace.Assert method in Release mode is not failing.
        Trace.Assert(i == 4);
        Trace.WriteLine(i == 4, "i is equla to 4");

        Console.WriteLine("Press a key to continue...");
        Console.ReadLine();

इस कोड को डिबग मोड और फिर रिलीज़ मोड में चलाएँ।

यहां छवि विवरण दर्ज करें

आप देखेंगे कि डिबग मोड के दौरान आपका कोड Debug.Assertस्टेटमेंट विफल हो जाता है, आपको एक संदेश बॉक्स मिलता है जिसमें एप्लिकेशन के वर्तमान स्टैक ट्रेस दिखाए जाते हैं। यह रिलीज मोड में नहीं हो रहा है क्योंकि Trace.Assert()हालत सच है (i == 4)

WriteLine() विधि बस आपको दृश्य स्टूडियो आउटपुट में जानकारी लॉग करने का एक विकल्प देता है। यहां छवि विवरण दर्ज करें


5

अभिकथन में अनुबंध (DbC) द्वारा डिजाइन में भारी सुविधा होती है, जैसा कि मैं समझता हूं कि मेयर, बर्टैंड द्वारा परिचय / समर्थन किया गया था। 1997. ऑब्जेक्ट-ओरिएंटेड सॉफ्टवेयर निर्देश।

एक महत्वपूर्ण विशेषता यह है कि उन्हें साइड-इफेक्ट्स का उत्पादन नहीं करना चाहिए, उदाहरण के लिए आप एक अपवाद को संभाल सकते हैं या यदि एक स्टेटमेंट (रक्षात्मक प्रोग्रामिंग) के साथ कार्रवाई का एक अलग कोर्स कर सकते हैं।

अनुबंध की पूर्व / पोस्ट की स्थिति की जांच करने के लिए उपयोग किया जाता है, ग्राहक / आपूर्तिकर्ता संबंध - ग्राहक को यह सुनिश्चित करना चाहिए कि आपूर्तिकर्ता की पूर्व-शर्तें उदाहरण के लिए मिलें। £ 5 भेजता है और आपूर्तिकर्ता को यह सुनिश्चित करना चाहिए कि पोस्ट की शर्तें पूरी हों। 12 गुलाब बचाता है। (ग्राहक / आपूर्तिकर्ता की बस सरल व्याख्या - कम स्वीकार कर सकते हैं और अधिक वितरित कर सकते हैं, लेकिन जोर के बारे में)। C # भी Trace.Assert () का परिचय देता है, जिसका उपयोग रिलीज़ कोड के लिए किया जा सकता है।

प्रश्न का उत्तर देने के लिए हाँ वे अभी भी उपयोगी हैं, लेकिन कोड के लिए जटिलता और पठनीयता जोड़ सकते हैं और बनाए रखने के लिए समय + मुश्किल से। क्या हमें अभी भी उनका उपयोग करना चाहिए? हाँ, क्या हम सब उनका उपयोग करेंगे? शायद या नहीं, मेयर का वर्णन किस हद तक है।

(यहां तक ​​कि OU जावा कोर्स कि मैंने इस तकनीक को केवल सरल उदाहरणों से सीखा है और बाकी कोड में अधिकांश कोड पर DbC अभिकथन नियमों को लागू नहीं किया गया है, लेकिन प्रोग्राम की शुद्धता को सुनिश्चित करने के लिए इसका उपयोग किया गया था!)


3

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

यह किसी को अपने कोड का उपयोग करने से रोकता है। लेकिन यह यह भी अनुमति देता है कि हड्डी का रास्ता उत्पादन के माध्यम से जाना और ग्राहक को बुरा संदेश न दें (यह मानते हुए कि आप एक रिलीज का निर्माण करें)।


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