मैं सोच रहा हूं कि ऐसा करने में सक्षम होना उपयोगी होगा, उदाहरण के लिए, शून्य संदर्भों के लिए पैरामीटर की जांच करने और अंततः अपवाद फेंकने के लिए।
यह कुछ टाइपिंग को बचाएगा और यदि कोई नया पैरामीटर जोड़ा गया है तो चेक जोड़ने के लिए भी भूलना असंभव हो जाएगा।क्या सी # में विधि के पैरामीटर के माध्यम से पुनरावृत्ति करना संभव है?
उत्तर
ठीक है, नहीं जब तक आप गिनती:
public void Foo(string x, object y, Stream z, int a)
{
CheckNotNull(x, y, z);
...
}
public static void CheckNotNull(params object[] values)
{
foreach (object x in values)
{
if (x == null)
{
throw new ArgumentNullException();
}
}
}
सरणी निर्माण हिट बचने के लिए आप तर्क की विभिन्न संख्या के लिए भार के के एक नंबर हो सकता है:
public static void CheckNotNull(object x, object y)
{
if (x == null || y == null)
{
throw new ArgumentNullException();
}
}
// etc
एक वैकल्पिक करने के लिए किया जाएगा यह घोषणा करने के लिए गुणों का उपयोग करें कि पैरामीटर शून्य नहीं हो सकते हैं, और उचित जांच उत्पन्न करने के लिए PostSharp प्राप्त करें:
public void Foo([NotNull] string x, [NotNull] object y,
[NotNull] Stream z, int a)
{
// PostSharp would inject the code here.
}
मान्य रूप से मैं शायद पोस्टशर्प को Code Contracts कॉल में परिवर्तित करने के लिए चाहता हूं, लेकिन मुझे नहीं पता कि दोनों एक साथ कितनी अच्छी तरह खेलते हैं। हो सकता है कि एक दिन हम युक्ति # की तरह लिखने के लिए सक्षम हो जाएगा:
public void Foo(string! x, object! y, Stream! z, int a)
{
// Compiler would generate Code Contracts calls here
}
... लेकिन निकट भविष्य :)
यह पैरामीटर है कि एक विधि (प्रतिबिंब के माध्यम से) के लिए घोषित किया गया है से अधिक पुनरावृति करने के लिए संभव है, लेकिन मैं एक विशिष्ट विधि कॉल के लिए उन मापदंडों का मान प्राप्त करने के लिए कोई रास्ता नहीं देख ...
शायद आप Postsharp का उपयोग कर सकते हैं, और आप इस चेक को कहां करते हैं, इसमें एक पहलू बनाएं। फिर, संकलन समय पर, Postsharp 'बुनाई' पहलू हर विधि है कि आप लिखित दिया है पर (अतिरिक्त कोड इंजेक्षन) कर सकते हैं ...
आप The Validation Application Block जो स्वचालित सत्यापन और The Unity Application Block का एक उदाहरण के रूप में इलाज किया जा सकता पर गौर कर सकते (विशेष रूप से इसकी अवरोध सुविधा) कॉल को अवरुद्ध करने और निरीक्षण मानकों के संबंध में।
में नहीं तुम एक params
कीवर्ड के साथ विधि पैरामीटर परिभाषित कर सकते हैं। यह आपकी विधि में पैरामीटर की एक चर-लंबाई संख्या को पारित करना संभव कर देगा। फिर आप उन पर पुन: प्रयास कर सकते हैं और शून्य संदर्भों की जांच कर सकते हैं या जो भी आप चाहते हैं।
public void MyMethod(params object[] parameters) {
foreach (var p in parameters) {
...
}
}
// method call:
this.MyMethod("foo", "bar", 123, null, new MyClass());
मेरी राय में हालांकि, यह चीजों को करने का एक अच्छा तरीका नहीं है। आपको अपने पैरामीटर के प्रकार को मैन्युअल रूप से नियंत्रित करना होगा, इनपुट सरणी में उनकी स्थिति और आप विजुअल स्टूडियो में उनके लिए इंटेलिजेंस का उपयोग करने में सक्षम नहीं होंगे।
मेरे पास कुछ समय पहले एक ही सवाल था, लेकिन लॉगिंग उद्देश्यों के लिए ऐसा करना चाहता था। मुझे कभी भी एक अच्छा समाधान नहीं मिला, लेकिन लॉगिंग विधि प्रविष्टियों और बाहर निकलने के लिए एओपी आधारित दृष्टिकोण का उपयोग करने के संबंध में यह लिंक मिला। इसके बारे में एक ऐसा ढांचा उपयोग करने की आवश्यकता है जो आपकी कक्षा को पढ़ सके और रनटाइम पर कोड इंजेक्ट करे जो आप करने की कोशिश कर रहे हैं। आसान नहीं लगता है।
एक विधि params
कीवर्ड का उपयोग करने का एक तुच्छ उदाहरण देने के बाद, RaYell का कहना है:
मेरी राय में हालांकि, यह काम करने के लिए एक अच्छा तरीका नहीं है। आपको को अपने पैरामीटर के प्रकार को मैन्युअल रूप से नियंत्रित करना होगा, इनपुट सरणी में उनकी स्थिति और आप विज़ुअल स्टूडियो में उनके लिए इंटेलिजेंस का उपयोग करने में सक्षम नहीं होंगे।
मैं करूंगा निश्चित रूप से सहमत हैं कि एक विधि है कि दो strings
, एक int
लेता है, एक object
है कि रिक्त हो सकता है, और एक अन्य MyClass
वस्तु params
का उपयोग कर की घोषणा एक बुरा विचार है। हालांकि, (मेरी राय में) params
कीवर्ड के पूरी तरह से वैध और उचित अनुप्रयोग हैं, अर्थात् जब पैरामीटर एक ही प्रकार के होते हैं। उदाहरण के लिए:
public T Max<T>(T x, T y) where T : IComparable<T> {
return x.CompareTo(y) > 0 ? x : y;
}
public T Max<T>(params T[] values) where T : IComparable<T> {
T maxValue = values[0];
for (int i = 1; i < values.Length; i++) {
maxValue = Max<T>(maxValue, values[i]);
}
return maxValue;
}
var mandatoryFields = (new object[] { input1, input2 }).Where(v => v == null || v.ToString().Trim() == "");
आप अशक्त मानकों की सूची प्राप्त होगा।
तो फिर तुम सिर्फ जोड़ सकते हैं
if(mandatoryFields.ToArray().Count > 0){}
- 1. क्या एक स्थिर विधि के माध्यम से एक आवृत्ति चर का उपयोग करना संभव है?
- 2. विधि पैरामीटर के माध्यम से इटरेटिंग
- 3. "पुनरावृत्ति" तरीकों के माध्यम से
- 4. क्या Django के {% url%} टेम्पलेट टैग के माध्यम से क्वेरी पैरामीटर पास करना संभव है?
- 5. क्या रिशेर्पर के माध्यम से कोड सॉर्ट करना संभव है?
- 6. क्या JSONArray के माध्यम से पुनरावृत्त करना संभव है?
- 7. क्या सी # में प्रतिबिंब के माध्यम से फ़ाइल जानकारी पुनर्प्राप्त करना संभव है?
- 8. क्या सी ++ में किसी फ़ंक्शन के पैरामीटर के रूप में कक्षा को पास करना संभव है?
- 9. क्या पहले इस्तेमाल करने के अलावा पहले किसी तत्व से पुनरावृत्ति करना प्रारंभ करना संभव है?
- 10. पासिंग पैरामीटर मार्गों के माध्यम से
- 11. क्या किसी विधि के पैरामीटर के रूप में एक मनमानी विधि समूह को पास करना संभव है?
- 12. क्या यूएसबी के माध्यम से पीसी से एंड्रॉइड में अपना इंटरनेट कनेक्शन साझा करना संभव है?
- 13. क्या टीसीपी के माध्यम से प्रसारण संभव है?
- 14. MATLAB में मैट्रिक्स के कॉलम के माध्यम से पुनरावृत्ति करने का सबसे अच्छा तरीका क्या है?
- 15. क्या पैरामीटर के लिए एक से अधिक प्रकार के संकेत निर्दिष्ट करना संभव है?
- 16. वेबकिटडॉटनेट का उपयोग कर सी # में वेबकिट ब्राउज़र के माध्यम से फ़ाइल डाउनलोड करना संभव है?
- 17. क्या GTalk Intent के माध्यम से संदेश भेजना संभव है?
- 18. क्या टेलनेट के माध्यम से एलडीएपी "अनुरोध" भेजना संभव है?
- 19. क्या यूआरआई पैरामीटर की चर संख्या के साथ जेएक्स-आरएस विधि को कॉन्फ़िगर करना संभव है?
- 20. क्या मोबाइल डिवाइस से किसी वेब ब्राउज़र के माध्यम से एक तस्वीर अपलोड करना संभव है?
- 21. प्रत्येक पुनरावृत्ति के माध्यम से SqlCommand पैरामीटर का पुन: उपयोग कैसे करें?
- 22. सरणी के प्रारंभिक निकाय को फ़ंक्शन पैरामीटर (सी-सरणी) के रूप में, क्या यह संभव है?
- 23. क्या यह सी # क्लास ऑब्जेक्ट के माध्यम से लूप करने के लिए संभव है?
- 24. उद्देश्य-सी में श्रेणियों के माध्यम से एक सिस्टम विधि को सशर्त रूप से ओवरराइड करना?
- 25. क्या एलकेएम के माध्यम से सिस्टम कॉल जोड़ना संभव है?
- 26. क्या सीएसएस के माध्यम से छोटे सर्किल बनाना संभव है?
- 27. क्या जावास्क्रिप्ट के माध्यम से टेक्स्टरेरा में वर्तनी जांच अक्षम करना संभव है?
- 28. क्या सभी कैरिज रिटर्न को स्ट्रिंग में .replace के माध्यम से प्रतिस्थापित करना संभव है?
- 29. आईओएस - क्या स्थानीयहोस्ट के माध्यम से ऐप्स के बीच संवाद करना संभव है?
- 30. क्या एक गैर एसिंक विधि में एक प्रतीक्षा योग्य विधि को कॉल करना संभव है?
आपके मामले में क्या CheckNotNull ((वस्तु []) नल) के बारे में? :-) –
सोचें कि लेखक का अर्थ जावास्क्रिप्ट के तर्कों की तरह कुछ है। जैसे "फू (स्ट्रिंग एक्स, ऑब्जेक्ट वाई, स्ट्रीम जेड, इंट ए)" विधि में सभी तर्कों को सूचीबद्ध करें और उनमें से प्रत्येक को निर्दिष्ट किये बिना उन्हें शून्य के लिए जांचें, लेकिन "सामान्य प्रमाणीकरण (Foo.arguments) जैसे कुछ सामान्य विधि पर कॉल करें;" । – Kamarey
@Dzmitry: ठीक है, हाँ - आप अभी तक काफी उत्पादन तैयार नहीं हैं :) –