2017-06-12 47 views
6

पर कॉल करते समय एफ # में व्यापक शून्य जांच करने का सबसे अच्छा तरीका क्या है, मैं एक # कार्यात्मक तरीके से एफ # से सी # कोड के साथ बातचीत करने का सबसे अच्छा तरीका जानना चाहता हूं, जब मुझे कई बार शून्य जांचना पड़ता है। क्योंकि मैं एफ # से अशक्त ऑपरेटरसी # कोड

public bool Authorize(DashboardContext dashboardContext) 
{ 
    var context = new OwinContext(dashboardContext.GetOwinEnvironment()); 
    var user = context.Authentication.User; 
    return user?.Identity?.IsAuthenticated ?? false; 
} 

है

सी # से, आसान है, मैं इस

let authorize (ctx:DashboardContext) = 
    match OwinContext(ctx.GetOwinEnvironment()) with 
    | null -> false 
    | c -> match c.Authentication.User with 
      | null -> false 
      | user -> user.Identity.IsAuthenticated 

बनाया लेकिन मैं इस बात से खुश नहीं हूँ। यह सही करने के लिए कार्यात्मक तरीका क्या है? मैंने सोचा कि शायद कुछ गणना अभिव्यक्ति मदद करेगी, लेकिन मुझे नहीं पता कि अभी तक कैसे पूरा किया जाए।

+0

आपका समाधान इस उपयोग के मामले के लिए ठीक दिखता है। – s952163

उत्तर

9

Option.ofObj एक शून्य वस्तु को Option में परिवर्तित कर देगा। फिर आप Option मॉड्यूल में पहले से परिभाषित सहायकों का उपयोग कर सकते हैं। उदाहरण के लिए, आपके द्वारा लिखे गए पैटर्न का हिस्सा पहले ही Option.bind द्वारा encapsulated है।

let authorize (ctx:DashboardContext) = 
    ctx.GetOwinEnvironment() |> OwinContext |> Option.ofObj 
    |> Option.bind (fun c -> c.Authentication.User |> Option.ofObj) 
    |> Option.map (fun user -> user.Identity.IsAuthenticated) 
    |> Option.defaultValue false 

Option.bind एक Option<'a> और एक समारोह है कि प्रकार 'a लेता है और एक Option<'a> रिटर्न लेता है। जब इसे पाइपलाइन में उपयोग किया जाता है तो यह Some "मैपिंग" का एक तरीका है या इसे None में फ़िल्टर कर रहा है।

मैं कहूंगा कि आपके द्वारा लिखा गया कार्य वास्तव में ठीक दिखता है, लेकिन इस तरह से थोड़ा और अधिक मूर्खतापूर्ण माना जा सकता है, हालांकि यह तर्कसंगत रूप से इस उदाहरण में पालन करना थोड़ा कठिन है। Option.bind वास्तव में अपने आप में आता है जब यह घोंसले के कई स्तरों को बचाता है।

यह ध्यान देने योग्य है कि आपके F # फ़ंक्शन और खान दोनों में हम Authentication और Identity गुणों की गैर-शून्यता और गुणों को एक्सेस करते समय शून्य संदर्भ अपवादों को खतरे में डाल रहे हैं। यह शून्य प्रक्षेपण का उपयोग कर सी # विधि के विपरीत है। फिलहाल एफ # में ऐसा करने का एक अंतर्निहित तरीका नहीं है लेकिन शायद इसे अनुकरण करने के लिए कुछ उन्नत तरीके हैं।

गणना गणनाओं के साथ ऐसा करना भी संभव है। MaybeBuilderhere देखें।

+1

आप अपने उपयोगकर्ता नाम के लायक हैं, श्री ** त्वरित ** ब्राउन फॉक्स: मैंने केवल अपना जवाब लिखना शुरू कर दिया था, और आपका बहुत अधिक पूरा है। :-) हालांकि, मैं कुछ मामलों में सरल 'isNull' फ़ंक्शन (जो कि' इनपुट 'शून्य है, और अगर उसका इनपुट शून्य नहीं है तो' सत्य 'वापस आ जाता है) भी उपयोगी हो सकता है। कभी-कभी आपको बस इतना ही चाहिए। लेकिन इस तरह के मामलों में जहां आपके पास चरणों की एक श्रृंखला है, 'विकल्प' प्रकार लगभग हमेशा बेहतर होता है (विशेष रूप से अगर श्रृंखला में कई बिंदुओं पर नल दिखाया जा सकता है)। – rmunn

+4

एक और विचार: कन्स्ट्रक्टर कॉल ('ओविनकॉन्टेक्स्ट') का परिणाम शून्य-जांच की आवश्यकता नहीं है। एक कन्स्ट्रक्टर कॉल कभी नल में परिणाम नहीं दे सकता है। –

+1

@FyodorSoikin एक नियमित समारोह की तरह एक कन्स्ट्रक्टर का उपयोग करने की कमी। इस तरह की चीजों के बारे में तर्क करना मुश्किल है। – mydogisbox