मैं निश्चित रूप से यह तर्क दूंगा कि अगर आपको प्रॉपर्टी सेटर या गेट्टर से अपवाद फेंकने की आवश्यकता महसूस होती है तो डिजाइन में कोई दोष है।
एक संपत्ति एक अमूर्तता है जो एक ऐसी चीज का प्रतिनिधित्व करती है जो सिर्फ एक मूल्य है । और आपको इस डर के बिना एक मूल्य निर्धारित करने में सक्षम होना चाहिए कि ऐसा करने से कोई अपवाद नहीं हो सकता है। *
यदि संपत्ति को साइड इफेक्ट में सेट किया जाता है, तो इसे वास्तव में एक विधि के रूप में लागू किया जाना चाहिए। और अगर यह कोई साइड इफेक्ट उत्पन्न नहीं करता है, तो कोई अपवाद नहीं फेंका जाना चाहिए।
पहले से ही एक अलग जवाब में उल्लिखित एक उदाहरण Stream.Position
संपत्ति है। यह दुष्प्रभाव पैदा करता है, और अपवाद फेंक सकता है। लेकिन यह संपत्ति सेटर मूल रूप से केवल एक आवरण है जिसके चारों ओर Stream.Seek
आप इसके बजाय कॉल कर सकते हैं।
व्यक्तिगत रूप से, मेरा मानना है कि स्थिति एक लेखन योग्य संपत्ति नहीं होनी चाहिए।
एक अन्य उदाहरण जहां आपको संपत्ति सेटर से अपवाद फेंकने के लिए लुभाया जा सकता है, वह डेटा के सत्यापन में है:
public class User {
public string Email {
get { return _email; }
set {
if (!IsValidEmail(value)) throw InvalidEmailException(value);
_email = value;
}
}
लेकिन इस समस्या का एक बेहतर समाधान है। एक मान्य ईमेल पते का प्रतिनिधित्व करने वाला एक प्रकार पेश करें:
public class Email {
public Email(string value) {
if (!IsValidEmail(value)) throw new InvalidEmailException(value);
...
}
...
}
public class User {
public Email Email { get; set; }
}
Email
वर्ग सुनिश्चित है कि यह है कि एक मान्य ईमेल पता नहीं है एक मूल्य को रोक नहीं सकते, और वर्गों है कि दुकान ईमेल की जरूरत उन्हें मान्य का कर्तव्य से मुक्त कर रहे हैं।
यह उच्च सामंजस्य (अच्छे सॉफ़्टवेयर डिज़ाइन का एक संकेतक) की ओर भी जाता है - एक ईमेल पता क्या है और इसे कैसे मान्य किया जाता है, इसके बारे में ज्ञान केवल Email
कक्षा में मौजूद है , जिसमें केवल यही चिंता है।
* ObjectDisposedException एकमात्र वैध अपवाद है (जिसका कोई उद्देश्य नहीं है) मैं इस समय सोच सकता हूं।