2012-06-08 16 views
21

एक पुराना काम सहयोगी अपने पिता को औजारों के बारे में उद्धृत करता था, "आपको इससे ज्यादा चालाक होना चाहिए।"क्या मैं वास्तव में न्यूनतम तारीख वापस करना चाहता हूं?

नीचे दिए गए कोड में, Resharper मुझे बता रहा है, "मान निर्दिष्ट असाइनमेंट पथ में उपयोग नहीं किया जाता है" (पहली पंक्ति को इंगित करता है)। अगर मैं मदद की पेशकश स्वीकार करता हूं, तो डीटी को एक मूल्य ("आज") असाइन नहीं किया जाता है।

क्या यह एक मामला है जहां "मुझे इससे ज्यादा चालाक होना है" और उनकी चेतावनी को अनदेखा करते हैं, या यह एक ऐसा मामला है जहां उपकरण मुझसे ज्यादा चालाक है, और मैं इसे समझ नहीं रहा हूं?

स्थिति पर मेरा लेना यह है कि अगर अगर कथन विफल हो जाता है, तो वर्तमान तिथि लौटा दी जाती है (डिफ़ॉल्ट मूल्य मैं चाहता हूं), लेकिन अगर मैं रिशेर्पर की "मांगों" को स्वीकार करता हूं तो यह डेटाटाइम के लिए डिफ़ॉल्ट मान वापस कर देगा, जो कि है न्यूनतम तारीख, जो मुझे लगता है वह 7/4/1776 या 1/1/0000 या उससे कुछ है।

DateTime dt = DateTime.Now; 
if (!(DateTime.TryParse(substr, out dt))) { 
    using (var dtpDlgForm = new ReturnDate("Please select the Date that the file was created:")) { 
     if (dtpDlgForm.ShowDialog() == DialogResult.OK) { 
      dt = dtpDlgForm.ReturnVal; 
     } 
    } 
} 
return dt; 
+8

यह एक ऐसा मामला है जहां मैं आपको कई रिटर्न का उपयोग करने का सुझाव दूंगा। यह अधिक स्पष्ट है कि यदि आप 'रिटर्न डेटटाइम.अब' के साथ अंतिम पंक्ति को प्रतिस्थापित करते हैं और 'वापसी dtpDlgForm.ReturnVal' के साथ उपयोग के बीच की रेखा को बदलते हैं। –

उत्तर

23

आपका इरादा तर्क (वरीयता के क्रम में) DateTime के तीन संभावित वापसी मूल्यों के लिए अनुमति देता है:

  1. substr की पार्स मूल्य।
  2. संवाद से चयनित मूल्य।
  3. वर्तमान दिनांक और समय।

आप अलग return बयान होने क्रियान्वित कर रहे हैं कि जब उनकी हालत सफल होता है द्वारा इस तर्क को लागू कर सकते हैं:

DateTime dt; 
if (DateTime.TryParse(substr, out dt)) 
    return dt; 

using (var dtpDlgForm = new ReturnDate(
    "Please select the Date that the file was created:")) 
{ 
    if (dtpDlgForm.ShowDialog() == DialogResult.OK) 
     return dtpDlgForm.ReturnVal; 
} 

return DateTime.Now; 

संपादित: तुम क्यों एक चर के लिए एक मूल्य निर्दिष्ट नहीं करना चाहिए पर स्पष्टीकरण के लिए कि out पैरामीटर के रूप में उपयोग किया जाएगा, Mark Byers’s answer देखें।

+2

धन्यवाद; सभी उत्तरों बहुत अच्छे थे। मैंने इसे "सही" के रूप में चिह्नित किया, क्योंकि यहां तक ​​कि फ़ाइल नाम से तारीख को बाहर नहीं किया गया है, और उपयोगकर्ता तब "संवाद" फ़ॉर्म को बंद कर देता है जिसे "ओके" के अलावा किसी संवाद परिणाम के साथ दिनांक के लिए उसे 12/7/1941 या जब भी "आज" देता है। –

+0

छोटे निगलना बिंदु: tryParse लाइन को किसी अन्य की आवश्यकता है अर्धविराम के स्थान पर सही माता-पिता। –

+0

@ क्लेशैनन: माइक बेंटगेई [ऊपर उल्लिखित] के रूप में (http://stackoverflow.com/questions/10952470/would-i-really-want-to-return-the-minimum-date/10952537 # comment14295586_10952470), यह एक ऐसा मामला है जहां एकाधिक 'रिटर्न' स्टेटमेंट बेहतर हो सकते हैं क्योंकि वे विधि के प्रवाह को सरल बनाते हैं - आप बस यह मान सकते हैं कि विधि की निष्पादन जैसे ही 'डेटटाइम' निर्धारण स्थिति सफल हो जाएगी। धन्यवाद 'TryParse' टाइपो को इंगित करना; अब एफ ixed। – Douglas

53

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

आप Resharper की सलाह का पालन करें और करने के लिए पहली पंक्ति बदलना चाहिए:

DateTime dt; 

यह चर dt वाणी लेकिन ऐसा नहीं करता इसे किसी भी मूल्य असाइन करें। यहां एक मान असाइन करने की कोई आवश्यकता नहीं है क्योंकि इसे out keyword के कारण अगली पंक्ति पर निश्चित रूप से असाइन किया जाएगा। प्रलेखन से:

out तर्क के रूप में पारित चर पारित किया जा रहा से पहले प्रारंभ की जरूरत नहीं है हालांकि, बुलाया विधि से पहले विधि रिटर्न एक मूल्य निर्दिष्ट करने की आवश्यकता है।

जोर मेरा। मान DateTime.Now असाइन करना अनावश्यक और भ्रामक है क्योंकि यह मान कभी भी उपयोग नहीं किया जाएगा।

स्थिति पर मेरी ले कि अगर अगर बयान विफल रहता है, आज की तारीख दिया जाता है

यही कारण है कि अपने कोड नहीं है। documentation से:

परिणाम: जब इस विधि रिटर्न, दिनांक और समय, रों में निहित है, तो रूपांतरण सफल रहा, या MINVALUE यदि रूपांतरण विफल करने के लिए दिनांक समय मूल्य बराबर होता है।

कोड तुम्हें तैनात करता है, तो पार्स तो विफल रहता है dt मूल्य DateTime.MinValue और नहीं मूल्य DateTime.Now कि आप सौंपा शामिल होंगे साथ

+0

+1 बहुत अच्छी व्याख्या। इस तरह की स्थिति में मैं अपने पक्ष में रीशेपर होने का आभारी हूं! मुझे अब अपने सभी TryParse उपयोगों से गुज़रना होगा .... :( – surfen

20

ऐसा इसलिए है क्योंकि आप डीटी को मान निर्दिष्ट कर रहे हैं और फिर इसे out param के रूप में पास कर रहे हैं।एक चर एक बाहर परम के रूप में पारित कर दिया गया है:

  • यह यह के भीतर इस्तेमाल किया जा रहा से पहले कि समारोह के अंदर एक मूल्य सौंपा जाना चाहिए
  • यह एक मूल्य सौंपा जाना चाहिए कि समारोह से पहले रिटर्न

पर

DateTime dt; 

मेरे ले: आपके मामले में, आप करने के लिए अपने पहली पंक्ति बदलकर ReSharper संदेश से संदेश ठीक कर सकते हैं स्थिति यह है कि अगर अगर कथन विफल रहता है, तो वर्तमान दिनांक लौटाया गया है

यह सच नहीं है। यह हमेशा दिनांक समय वस्तु आप में पास के मूल्य के DateTime.MinValue वापस आ जाएगी, भले ही

MSDN - DateTime.TryParse(string, out DateTime) से:।

परिणाम

प्रकार: System.DateTime%

जब यह विधि लौटाती है, [परिणाम] में दिनांक दिनांक मान एस में निहित दिनांक और समय के बराबर है, यदि रूपांतरण सफल हुआ, या MinValue यदि रूपांतरण विफल हुआ। रूपांतरण विफल रहता है यदि एस पैरामीटर शून्य है, एक खाली स्ट्रिंग ("") है, या में दिनांक और समय का वैध स्ट्रिंग प्रतिनिधित्व नहीं है। यह पैरामीटर अनियमित किया गया है।

(जोर जोड़ा)

8

एक out पैरामीटर हमेशा इसे एक मान दिया गया है। यह हमेशा गारंटी दी जाती है कि बुलाया जाने वाला कार्य लौटने से पहले इसे मान देता है। इसलिए यह किसी भी मामले में शुरू में दिए गए मूल्य को ओवरराइट कर देगा।

7

यहां मुद्दा यह out parameter modifier का उपयोग कर के बारे में है:

हालांकि बाहर तर्क के रूप में पारित चर पारित किया जा रहा से पहले प्रारंभ की जरूरत नहीं है, कहा जाता विधि विधि रिटर्न से पहले एक मूल्य निर्दिष्ट करने की आवश्यकता है।

DateTime.TryParse वैसे भी dt लिए एक डिफ़ॉल्ट मान प्रदान करेंगे, और अगर यह substr पार्स नहीं कर सकता है, जिसके परिणामस्वरूप dt न्यूनतम datetime का मूल्य होगा।

3
DateTime.TryParse(substr, out dt); 

झूठी वापसी कर सकता है लेकिन यह अभी भी dt संशोधित करेगा। यह dt को अपनी योग्यता के अनुसार पूरा करने का प्रयास करेगा, कुछ मूल्यों को यथासंभव सर्वोत्तम रूप से शुरू कर देगा। सी # में out संशोधक का उपयोग कर, आप इस कार्यक्रम को कह रहे हैं यह प्रारंभ करने, और आप आप में पारित मूल्य बनाए रखने के लिए उम्मीद नहीं करनी चाहिए।

तुम कर सकते हो क्या

DateTime dt; 
if (!(DateTime.TryParse(substr, out dt))) { 
    using (var dtpDlgForm = new ReturnDate("Please select the Date that the file was created:")) { 
     if (dtpDlgForm.ShowDialog() == DialogResult.OK) { 
      dt = dtpDlgForm.ReturnVal; 
     } 
     else { 
      dt = DateTime.Now; 
     } 
    } 
} 

return dt; 
+0

मुझे लगता है कि TryParse सफल होने पर आपका कोड आज वापस आ जाएगा। यह सही नहीं है, अगर TryParse सफल होता है, तो पार्स किए गए मान को वापस किया जाना चाहिए। – comecme

+0

हे भगवान, आप पूरी तरह से सही हैं। इसे प्रतिबिंबित करने के लिए मेरा जवाब बदल दिया। –

3

इस कोड को बनाना होगा है चेतावनी दूर चले जाओ। लेकिन मुझे लगता है कि डगलस का जवाब पढ़ने में आसान है।

DateTime dt; 
if (!(DateTime.TryParse(substr, out dt))) { 
    dt = DateTime.Now; 
    using (var dtpDlgForm = new ReturnDate("Please select the Date that the file was created:")) { 
     if (dtpDlgForm.ShowDialog() == DialogResult.OK) { 
      dt = dtpDlgForm.ReturnVal; 
     } 
    } 
} 
return dt; 
संबंधित मुद्दे

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