2012-04-23 18 views
8

में अनुमति सेट को परिभाषित करने के लिए एनम्स अलग-अलग कॉलम या एसक्यूएल सर्वर तालिका में प्रत्येक अनुमति को विभाजित करने के बजाय हम Flag विशेषता Enum पर बिट वार ऑपरेशंस के उपयोग के लिए उपयोग करने पर पुनर्विचार कर रहे हैं। संसाधनों को पढ़ने (पढ़ने, संशोधित करने, अपडेट करने) के लिए हमारा आवेदन अंतिम बिंदु (बाकी सेवाओं से नहीं) को परिभाषित करता है और प्रत्येक उपयोगकर्ता उदाहरण के लिए Bob has permissions to Read, Modify resource X के लिए अनुमतियों के हकदार है, इसलिए जब बॉब आता है और इस संसाधन को एक्सेस करता है तो हम जांचते हैं कि बॉब को अनुमति है x.Now कि जहां हम लागू करने के लिए यह स्पष्ट है जा रहे हैं यहाँ मेरा संदेह कर रहे हैंसी #

  • मान लीजिए बॉब है पढ़ें, लिखें मैं क्या करना होगा फ्लैग किए गए enumerations का उपयोग कर संसाधन पर अनुमति हटाएँ Permission.Read | Permission.Write | Permission.Delete बिट बुद्धिमान और एक के अंतिम परिणाम है पूर्णांक या एक और Enum?

  • डेटाबेस तालिका में इस अनुमति को संग्रहीत करने के लिए कॉलम integer होना चाहिए?

  • यदि प्रश्न 1 का उत्तर Enum है तो क्या मुझे Permissions enum पर एक और संपत्ति परिभाषित करनी चाहिए जो बिट वार और ऑपरेशन के पूर्णांक मान का प्रतिनिधित्व करती है?

disclaimer: बॉब उदाहरण में निर्दिष्ट साइटों या किसी भी व्यक्ति के ढेर अतिप्रवाह नेटवर्क में किसी भी उपयोगकर्ता का प्रतिनिधित्व नहीं करता। यह सिर्फ एक और चरित्र

उत्तर

10

क्रम में आपके सवालों के जवाब के लिए:

  • मान लिया जाये कि आप enum पर [Flags] विशेषता निर्धारित किया है, और (बिटवाइज़ के संचालन के लिए & और |) सही ऑपरेटर का उपयोग यह दोनों अनिवार्य है। यदि आप परिणाम को पूर्णांक में डाल देते हैं, तो आपको थोड़ा सा और प्रासंगिक मानों का अर्थ मिलेगा, यानी। 7 आपके उदाहरण के लिए। यदि आप .ToString() का उपयोग करते हैं, तो आपको एक स्ट्रिंग बैक मिलेगा जो दर्शाता है कि मान में सभी तीन मान हैं।मेरा मानना ​​है कि कहीं न कहीं है कि वहाँ एक HasFlags() विधि है, लेकिन सबसे कोड मैंने देखा है की तुलना के लिए मुकदमा किया और सच्चे बिटवाइज़ कोड, यानी उपयोग करता है:

    var x = Permissions.Read | Permissions.Write; 
    if ((x & Permissions.Read) == Permissions.Read) { print "Success!"; } 
    

    एक तकनीकी दृष्टिकोण से, सी # के प्रकार सुरक्षा बातें समझदार और परिणाम रखने में मदद करता | आईएनजी या & ही प्रकार के दो enum रों ing के एक ही प्रकार का एक और enum है लेकिन सभी enum रों बस पूर्णांक हैं, और, ज्यादातर मामलों में इस तरह के रूप में इलाज किया जा सकता है, हालांकि कुछ बातें स्पष्ट डाले int से/की जरूरत है।

  • यह एक अभिन्न प्रकार होना चाहिए, हां। मेरा मानना ​​है कि एनम के लिए डिफ़ॉल्ट प्रकार Int32 है, हालांकि आप स्पष्ट रूप से सेट कर सकते हैं यदि आप डेटाबेस और कोड को बिल्कुल मेल करना चाहते हैं।

  • उपर्युक्त सभी को देखते हुए, यह अभी भी अनुमतियों के सामान्य रूप से उपयोग किए जाने वाले सेटों के लिए पूर्वनिर्धारित मान रखने के लिए बहुत अधिक समझ में आता है, उदाहरण के लिए ReadWrite। विशेष रूप से, माइक्रोसॉफ्ट द्वारा सभी enums के लिए None तत्व की सिफारिश की जाती है, खासकर यदि आप मूल्यों कास्टिंग करने जा रहे हैं। यह फॉलबैक और ताजा प्रारंभिक चर के लिए एक मान्य मान के साथ-साथ default(Permissions) के लिए एक सिन वैल्यू की अनुमति देता है। तुम इतनी जैसे अन्य लोगों के आधार पर अपने enum में मूल्यों को निर्धारित कर सकते हैं:

    [Flags] 
    enum Permissions { 
        None = 0, 
        Read = 0x001, 
        Write = 0x010, 
        Execute = 0x100, 
        ReadWrite = Read | Write, 
        // [snip] 
    } 
    
+0

@ मैथ्यू को अपने सिर से दूर कर दूंगा, बिटवर्क के परिणाम को संग्रहित करना या तालिका में पूर्णांक के रूप में। मुझे एप्लिकेशन में अपनी अनुमति जांच कैसे करनी चाहिए। यहां कोड में बोलना 'अगर (IntegerFromDb == अनुमतियां। पढ़ें) {प्रिंट "सफलता!"; } 'होना चाहिए ** मैं टाइप अनुमतियों के Enum के लिए पूर्णांक पार्स ** और चेक कर सकते हैं? – Deeptechtons

+0

@ डिप्टेचटन: आप आसानी से enum प्रकार पर किसी भी पूर्णांक को कास्ट कर सकते हैं: 'var perms = (अनुमतियां) IntegerFromDb'। यह सबसे सुरक्षित तरीका है, हालांकि मुझे लगता है कि आप बिना किसी कलाकार के ऊपर दिए गए कोड के साथ तुलना करने में सक्षम हो सकते हैं। अपेक्षित मान के साथ हमेशा '&' की तुलना करें, विशेष रूप से यदि सुझाए गए 'रीडवाइट' जैसे संयुक्त मानों का उपयोग करना क्योंकि एक होना संभव है और दूसरे को नहीं और '! = कोई नहीं' शैली की जांच करें। –

+0

@ डिप्टेचटन: यद्यपि enums के लिए sane मानों के बारे में बिंदु # 3 में मेरे नोट्स को पढ़ना सुनिश्चित करें। सी # कुछ भयानक खेल सकता है यदि आप एक enum के लिए एक पूर्णांक डाला जो मूल्य के लिए समझ में नहीं आता है। –

5
  1. बिटवाइड या/और [ध्वज] के साथ चिह्नित enum के मूल्यों के लिए समान enum के मान हैं।
  2. इंटीजर डेटाबेस में enum मानों को स्टोर करने के लिए उचित दायर किया गया है।
  3. नहीं, आपको अतिरिक्त enum मान जोड़ने की आवश्यकता नहीं है, लेकिन यह अविश्वसनीय के लिए ऐसा कर सकता है।

Normaly आप FlagsAttribute के साथ इस तरह enums परिभाषित अर्थात

[Flags] enum My { 
    None = 0, Read =1, Write =2, Delete = 4 
}; 

जब इस तरह से आप के साथ विभिन्न मूल्यों को जोड़ सकते हैं परिभाषित | (या) आपरेशन:

My readAndWrite = My.Read | My.Write; 

बिटवाइस और enum मूल्यों कि अद्वितीय झंडे का प्रतिनिधित्व करने के लिए आप 0 दे देंगे, लेकिन आमतौर पर अन्य बिट्स मुखौटा के लिए इस्तेमाल किया:

bool doIHaveWrite = (readAndWrite & My.Write) == My.Write; 

ध्यान दें कि तार्किक और (& &) कर सकते हैं enum मूल्यों पर लागू नहीं किया जाएगा।

+2

+1 साफ तुम लोग दोनों मुझे मदद की है अगर वहाँ था वैसे भी मैं दोनों के जवाब के रूप में चिह्नित कर सकते हैं, इतने पर जैसे कोई सुविधा भगवान अभी व। मैं आपको – Deeptechtons

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

  • कोई संबंधित समस्या नहीं^_^