इज़ का क्या मतलब है?


36

मुझे कभी-कभी निम्न कोड दिखाई देता है, और यह पता नहीं चलता है कि वास्तव में अभिव्यक्ति क्या परीक्षण कर रही है।

public static void Something(string[] value)
{
   if (value is { })
   {
      DoSomethingElse();
   }
}

जवाबों:


28

यह सिर्फ # 8 में खाली संपत्ति पैटर्न है, जिसका अर्थ है कि मूल्य नहीं null। यह किसी भी मूल्य प्रकार या संदर्भ प्रकार से मेल खाता है। जैसा कि पानागोटिस कानवोस टिप्पणियों में लिखते हैं, यह अच्छी पुरानी value is objectजांच के बराबर है जो लंबे समय से C # में है।

आम तौर पर यदि आप एक संपत्ति निर्दिष्ट करना चाहते थे, तो यह मेल खाएगा या नहीं। यह गूढ़ उदाहरण दिखाता है कि:

if (value is { Length: 2 })
{
   // matches any object that isn't `null` and has a property set to a length of 2
}

संपत्ति पैटर्न सबसे अच्छा काम करते हैं और switchअभिव्यक्तियों जैसे मामलों में अन्य पैटर्न के साथ तुलना करते समय सबसे स्पष्ट होते हैं ।


1
इस मामले में खाली वस्तु का क्या मतलब है? खाली स्ट्रिंग, सफेद स्थान?
ओलेग

3
@OlegI नहीं, यह नहीं है। sनिश्चित नहीं है। is {}के लिए आशुलिपि है is objectऔर तार आपत्ति के लिए डाले जा सकते हैं।
पैनागोटिस कान्वोस

6
@OlegI तो कैसे? इसका एक वैध संदर्भ है इसलिए यह मेल खाता है।
डेनियल ए। व्हाइट

3
इसकी एक नई दुनिया जहां structs अशक्त हो सकता है और संदर्भ नल नहीं हो सकता, स्विच बयान को उलट दिया और विभिन्न कर रहे हैं !, !!, ?और ??पहले और बाद में गुण अलग अलग बातें मतलब है। सिंटैक्टिक शुगर कब खत्म होगी?
ja72

3
क्या यह वैसा ही है value != null?
ca9163d9

7

हालांकि डैनियल का जवाब सही है, मुझे लगता है कि कुछ संदर्भ जोड़ना उपयोगी हो सकता है कि आप उपयोग में खाली संपत्ति पैटर्न क्यों देख सकते हैं। इस उदाहरण नियंत्रक विधि पर विचार करें जिसे कुछ सत्यापन की आवश्यकता है:

public async Task<IActionResult> Update(string id, ...) 
{
    if (ValidateId(id) is { } invalid)
        return invalid;
    ...
}

ऊपरोक्त में, ValidateId() अशक्त या का एक उदाहरण दे सकता है BadObjectRequestResult। यदि पूर्व वापस कर दिया जाता है, तो सत्यापन सफल होता है और बाकी के शरीर में चला जाता है Update। यदि उत्तरार्द्ध लौटाया is {}जाता है , तो सत्य है (अर्थात निश्चित रूप से एक उदाहरण BadObjectRequestResultहै object), और सत्यापन विफल हो जाता है।

अच्छी तरह से, इसमें से हमने एक चर नाम भी दिया है invalid, जिसे हम तुरंत वापस कर सकते हैं। इसके बिना हमें थोड़ा अधिक वर्बोस कोड की आवश्यकता होगी।

public async Task<IActionResult> Update(string id, ...) 
{
    var invalid = ValidateId(id);
    if (invalid != null)
        return invalid;
    ...
}

चाहे एक अधिक पठनीय हो या दूसरा पाठक पर निर्भर हो, मैंने सिर्फ एक तरीका प्रस्तुत किया है जिससे खाली संपत्ति पैटर्न का उपयोग किया जा सकता है।


उस स्थिति में एक का उपयोग करना चाहिए is object invalid, न किis {} invalid
Panagiotis Kanavos

1
@PanagiotisKanavos कि इस मामले में काम नहीं करेगा क्योंकि IActionResult( वापसी की आवश्यकता है तकनीकी रूप से Task<IActionResult>)। यदि हम आपकी शैली के साथ चलते हैं, तो ifइसका परिणाम समान है, लेकिन invalidयह एक objectऐसा संकलन नहीं होगा।
किट

0

मुझे लगता है कि यह जांचना है कि क्या मूल्य एक खाली वस्तु है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.