2009-07-13 3 views
6

मैं वीएस 2008 का उपयोग कर रहा हूं, और प्रोजेक्ट के लिए मेरे प्रॉपर्टी पेजों में मैं देखता हूं कि मैं लक्ष्यीकरण कर रहा हूं। नेट 3.5।सी # 3 में स्वचालित गुण - अगर मैं सेट के लिए घोषित करता हूं तो एक निकाय घोषित करना चाहिए?

AMSDataModels.Vehicle.VIN.get 'एक शरीर घोषित करना चाहिए, क्योंकि यह सार चिह्नित नहीं है, निर्वासन, या आंशिक

:

यहाँ त्रुटि मैं जब संकलन करने की कोशिश कर रहा हो रही है

और यहाँ कोड है: अगर मैं सेट से शरीर पट्टी

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace AMSDataModels 
{ 
    public class Vehicle 
    { 
     //NodeID for datastore persistance 
     public Guid NodeID { get; set; } 

     public string VIN { get; 
      set { 
       if (value.Length != 17) throw new ArgumentOutOfRangeException("VIN", "VIN must be 17 characters"); 
      } } 

     public string Make { get; set; } 
     public string Model { get; set; } 
    } 
} 

इसलिए इसकी सिर्फ इतना है कि:

public string VIN { get; set; } 

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

क्या किसी के पास इस समस्या को हल करने के लिए या बेहतर तरीके से पहुंचने का एक बेहतर तरीका है?

मुझे वास्तव में शॉर्टंड नोटेशन पसंद है - लेकिन इनपुट की वैधता की पुष्टि करना भी महत्वपूर्ण है!

+0

उन सभी लोगों के लिए धन्यवाद जिन्होंने ध्यान दिया है कि मैं वास्तव में कहीं भी मूल्य निर्धारित नहीं कर रहा था - ईमानदारी से मुझे अभी तक यह पता नहीं लगा था कि संकलक स्थानीय चर क्या बना रहा था। क्या कोई विशेष कीवर्ड है? – Matt

+1

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

+0

जब आप INotifyPropertyChanged का उपयोग करने का प्रयास करते हैं, तो आप उसी समस्या में भाग लेंगे, स्वचालित गुणों की सुंदरता जल्दी से खो जाती है :( – Nate

उत्तर

17

यदि आप सेट में तर्क जोड़ने जा रहे हैं, तो आपको इसे भी प्राप्त करने की आवश्यकता है। आपके सेट में नोटिस आप वास्तव में कुछ भी मूल्य निर्धारित नहीं कर रहे हैं?

एक समर्थन फ़ील्ड जोड़ें,

private string _vin; 

और वापसी कि मिल में।

public string VIN 
{ 
    get { return _vin; } 
    set 
    { 
     if (value.Length != 17) 
     throw new ArgumentOutOfRangeException("VIN", "VIN must be 17 characters"); 
     else 
     _vin = value; 
    } 
} 
+0

धन्यवाद, मुझे लगता है कि मेरी पहली प्राथमिकता यह सुनिश्चित कर रही थी कि मैं निजी क्षेत्र बनाने या अनावश्यक काम नहीं कर रहा था किसी भी तरह से स्वचालित गुणों का गलत उपयोग करने का प्रयास नहीं कर रहा है। – Matt

+0

वास्तव में आपको फ़ील्ड बनाने की आवश्यकता नहीं है केवल वीआईएन वापस करें :) –

+5

"वापसी वीआईएन"? यह एक पुनरावर्ती कार्य होगा जब तक कि मुझे कुछ स्पष्ट याद आ रही है ... –

3

हां, आपको भी कार्यान्वयन की घोषणा करनी होगी। ओह, और आपका सेट कोड सत्यापन के अलावा कुछ भी नहीं करता है। इसके लिए आपको अतिरिक्त कार्यान्वयन भी प्रदान करना होगा, यह मानते हुए कि यदि आप सत्यापन पास करते हैं तो आप मान निर्धारित करना चाहते हैं।

यदि आपको केवल मूलभूत/सेट कार्यान्वयन की तुलना में कुछ और चाहिए, तो आपको केवल संपूर्ण अंतर को लागू करने की आवश्यकता नहीं होगी।

6

जब स्वत: गुण उपयोग किया जाता है, संकलक स्वचालित रूप से एक समर्थक क्षेत्र उत्पन्न करता है। जब आप अपना खुद का घोषित करते हैं, तो यह जानने का कोई तरीका नहीं है कि विधि प्राप्त करने के लिए किस क्षेत्र का उपयोग करना है। तो आपको दोनों या कोई भी घोषित करना होगा।

संयोग से, आपकी वर्तमान सेट विधि केवल मूल्य के लिए जांचती है - यह वास्तव में इसे किसी भी चीज़ को कभी भी असाइन नहीं करती है।

+0

आईडीई पर वापस मुझे लगता है - धन्यवाद। – Matt

2

आपको अच्छे ओएल बैकिंग फील्ड का उपयोग करना होगा। शॉर्ट-हाथ नोटेशन मिश्रित नहीं किया जा सकता है। प्राप्त करने और सेट पर एक्सेस संशोधक को बदलने का एकमात्र अतिरिक्त मजा है, उदा। प्राप्त; निजी सेट;

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