2009-06-24 7 views
10

क्या शायद एक मूर्खतापूर्ण सवाल यह है कि के लिए खेद है, लेकिन यह मुझे गुस्सा दिलाना है ...ऐरे उदाहरणों में ऐरे विधियों को क्यों नहीं बनाया गया है?

int[] i = {3, 2, 1}; 
//why 
Array.Sort(i); 
//instead of 
i.Sort(); 

char c = 'c'; 
//why 
char.IsLetter(c); 
//instead of 
c.Isletter(); 
+1

वाह, इतने सारे गलत जवाब:

इन सवालों देखें। – VVS

+2

क्या आपको सही मिला है? इसे डाक से भेजें। –

+2

यह प्रश्न http://stackoverflow.com/questions/389257/why-is-dotnets-char-islower-a-static-method के समान ही है। –

उत्तर

4

पेड्रो डी एक्विनो के लिए इन अन्य प्रश्नों की पहचान करने के लिए धन्यवाद जो उत्तर प्रदान करते हैं।

मूल बिंदु यह है कि संरचनाओं पर उदाहरण विधियां थ्रेड-सुरक्षित नहीं हैं लेकिन स्थैतिक विधियां हैं।

+1

समुदाय wiki'd क्योंकि यह मेरा कोई काम नहीं है। –

1

आप विस्तार तरीकों का उपयोग कर अपने आप के लिए यह करना है, तो आप .NET 3.0 का उपयोग कर सकते:

public static class Extensions 
{ 
public static bool IsLetter(this chr) 
{ 
return char.IsLetter(chr); 
} 
} 

तो फोन यह पसंद है: c.IsLetter()

या जिस तरह से आप चाहते हैं उसे करें।

1

सॉर्ट करने पर वही एक कार्यान्वयन निर्णय है। मुझे नहीं पता कि ढांचे के डिजाइनर के सिर के माध्यम से क्या चल रहा था, लेकिन मेरा मानना ​​है कि एक कारण है कि कस्टम प्रकारों की सरणी को कम से कम प्रयास के साथ हल किया जाए।

कोई भी वर्ग जो iComparable लागू करता है उसे एक सरणी में रखा जा सकता है और क्रमबद्ध किया जा सकता है। अगर यह सरणी का एक तरीका था, तो मुझे अपने कस्टम प्रकार के लिए एक नया ऐरे प्रकार लिखना होगा।

इसके अलावा, जैसा कि अन्य ने नोट किया है, प्राचीन प्रकारों को एक सरणी के इस डिज़ाइन की आवश्यकता होती है।

+0

सॉर्ट एक उदाहरण विधि है, तो मैं आपके तर्क से सहमत नहीं हूं। यह कस्टम सरणी प्रकार लिखने की आवश्यकता के बिना स्थिर विधि के तरीके को भी काम करने में सक्षम होगा। –

+0

प्रत्येक उप ऑब्जेक्ट के लिए किस प्रकार का उदाहरण उदाहरण विधि का उपयोग करेगा? –

+0

@ जेफ येट्स, लेकिन यदि आप सॉर्ट के कार्यान्वयन को बदलना चाहते हैं, तो आपको ऐरे क्लास कोहांज की आवश्यकता नहीं है, लेकिन आप कहीं भी स्थिर विधि जोड़ सकते हैं। लेकिन चूंकि .net भाषाओं में LINQ क्षमता के बाद, एक्सटेंशन विधियां हैं, जो उदाहरण विधियों की तरह दिखती हैं, लेकिन स्थिर विधियां हैं। मुझे लगता है कि यह काफी समझौता है। – TcKs

2

ये उपयोगिता विधियां हैं जिन्हें इन कक्षाओं से संबंधित होने की आवश्यकता नहीं है। यह पुष्ट Single Responsibility Principle

(संपादित) मैं जावा

(About static members) के साथ भ्रमित किया गया था:

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

thread-safe point of view भी एक अच्छा कारण है।

+0

धन्यवाद - अभी भी मुझे लगता है कि एक सरणी स्वयं को हल करने में सक्षम होना चाहिए - अगर मैं सी ++ में कोड करना चाहता था तो मैं :) – paul

+0

@bruno अच्छी तरह से, लेकिन "isLetter" ऑब्जेक्ट की पहचान पर निर्भर करता है, है ना? मेरा मतलब है, 'ए' .isLetter() निश्चित रूप से '4' से अलग है .isLetter()। –

+0

@ पेड्रो, यहां, "ऑब्जेक्ट के साथ क्या होता है इसके बावजूद डेटा और फ़ंक्शन नहीं बदलते हैं"। "C.isLetter()" के अस्तित्व के लिए, इसे चार संरचना में अतिरिक्त बूल मान को सहेजना होगा। कार्यान्वयन अलग होगा ... –

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