SQL सर्वर में IsNull () फ़ंक्शन का C # समतुल्य है


113

SQL सर्वर में आप IsNull()फ़ंक्शन का उपयोग यह जांचने के लिए कर सकते हैं कि कोई मान शून्य है, और यदि यह है, तो दूसरा मान लौटाएं। अब मैं सोच रहा हूं कि क्या C # में भी ऐसा ही कुछ है।

उदाहरण के लिए, मैं कुछ ऐसा करना चाहता हूं:

myNewValue = IsNull(myValue, new MyValue());

के बजाय:

if (myValue == null)
  myValue = new MyValue();
myNewValue = myValue;

धन्यवाद।

जवाबों:


204

इसे अशक्त सहवर्ती ( ??) ऑपरेटर कहा जाता है :

myNewValue = myValue ?? new MyValue();

3
मैंने अशक्त-संचालक ऑपरेटर का उपयोग करने की कोशिश की, लेकिन त्रुटि ऑपरेटर को रखा गया '' ?? 'बूल' के ऑपरेंड पर लागू नहीं किया जा सकता है और 'int' । त्रुटि भ्रामक थी। समस्या यह थी कि मैं बूलियन वैरिएबल में राइट-हैंड ऑपरेंड स्थिति में एक इंट को असाइन करने का प्रयास कर रहा था। मैं से बदलना पड़ा this.BinaryExists = vModel.BinaryExists ?? 0;करने के लिए this.BinaryExists = vModel.BinaryExists ?? false;
14

14

अफसोस की बात है, डीबीएनएल के साथ काम करने वाले अशक्त कोलेसिंग ऑपरेटर के बराबर नहीं है; उसके लिए, आपको टर्नरी ऑपरेटर का उपयोग करने की आवश्यकता है:

newValue = (oldValue is DBNull) ? null : oldValue;

15
नाइटपिक: मुझे पता है कि बहुत सारे स्थान इसे टर्नरी ऑपरेटर के रूप में संदर्भित करते हैं। इस समय केवल एक ही टर्नरी ऑपरेटर होता है, लेकिन यह इसका एक गुण है, इसका नाम नहीं। यह वास्तव में सशर्त ऑपरेटर है। यदि C # कभी भी एक अन्य टर्नरी ऑपरेटर प्राप्त करता है, तो बहुत सी भ्रमित करने वाली पुस्तकें होंगी।
जॉन स्कीट

आप dbnull को किसी ऑब्जेक्ट ((ऑब्जेक्ट) oldValue ?? (ऑब्जेक्ट) DBNull.Value) में डाल सकते हैं
जेरेमी ग्रे

1
@JeremyGray (object)oldValue ?? (object)DBNull.Value)उस समतुल्य होगा ((object)oldValue == null) ? (object)DBNull.Value : (object)oldValueजो कि रॉबर्ट रोसनी के समाधान पतों की समस्या से अलग है।
त्रिशूल

5
public static T isNull<T>(this T v1, T defaultValue)
{
    return v1 == null ? defaultValue : v1;
}

myValue.isNull(new MyValue())

इस तरह, new MyValue()वसीयत को तब भी निष्पादित किया जाएगा जब myValueवह अशक्त न हो और इसकी आवश्यकता न हो !!
एस। सेरपोशन

4

समान विधि का उपयोग करें:

object value2 = null;
Console.WriteLine(object.Equals(value2,null));

यह उत्तर केवल सही या गलत रिटर्न देता है, जो कि ओपी ने नहीं पूछा था।
कुल्मे

1

डीबी नल के साथ काम करने के लिए, मैंने अपने वीबी अनुप्रयोगों के लिए एक गुच्छा बनाया। मैं उन्हें Cxxx2 कहता हूं क्योंकि वे VB के अंतर्निहित Cxxx फ़ंक्शन के समान हैं।

आप उन्हें मेरे सीएलआर एक्सटेंशन प्रोजेक्ट में देख सकते हैं

http://www.codeplex.com/ClrExtensions/SourceControl/FileView.aspx?itemId=363867&changeSetId=17967


ऐसा लगता है कि उन्होंने कोडप्लेक्स के सभी URL बदल दिए हैं। इसे आज़माएँ: clrextensions.codeplex.com/SourceControl/changeset/view/…
जोनाथन एलन

0

आप दो फंक्शन लिखिए

    //When Expression is Number
    public static double? isNull(double? Expression, double? Value)
    {
        if (Expression ==null)
        {
            return Value;
        }
        else
        {
            return Expression;
        }
    }


    //When Expression is string (Can not send Null value in string Expression
    public static string isEmpty(string Expression, string Value)
    {
        if (Expression == "")
        {
            return Value;
        }
        else
        {
            return Expression;
        }
    }

वे बहुत अच्छी तरह से काम करते हैं


2
हालांकि यह कोड स्निपेट समस्या को हल कर सकता है, यह इस बात की व्याख्या नहीं करता है कि यह प्रश्न का उत्तर क्यों या कैसे देता है। कृपया अपने कोड के लिए एक स्पष्टीकरण शामिल करें , क्योंकि यह वास्तव में आपके पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है। फ्लैगर्स / समीक्षक: कोड-ओनली उत्तरों जैसे कि यह एक, डाउनवोट, डिलीट न करें!
लुका किबेल

0

मैं अपने DataRow प्रकारों पर निम्नलिखित एक्सटेंशन विधि का उपयोग कर रहा हूं:

    public static string ColumnIsNull(this System.Data.DataRow row, string colName, string defaultValue = "")
    {
        string val = defaultValue;
        if (row.Table.Columns.Contains(colName))
        {
            if (row[colName] != DBNull.Value)
            {
                val = row[colName]?.ToString();
            }
        }
        return val;
    }

उपयोग:

MyControl.Text = MyDataTable.Rows[0].ColumnIsNull("MyColumn");
MyOtherControl.Text = MyDataTable.Rows[0].ColumnIsNull("AnotherCol", "Doh! I'm null");

मैं पहले कॉलम के अस्तित्व के लिए जाँच कर रहा हूँ क्योंकि यदि किसी भी क्वेरी परिणाम का उस कॉलम के लिए कोई गैर-शून्य मान नहीं है, तो DataTable ऑब्जेक्ट भी उस कॉलम को प्रदान नहीं करेगा।


0

नीचे दिए गए तरीकों का उपयोग करें।

    /// <summary>
    /// Returns replacement value if expression is null
    /// </summary>
    /// <param name="expression"></param>
    /// <param name="replacement"></param>
    /// <returns></returns>
    public static long? IsNull(long? expression, long? replacement)
    {
        if (expression.HasValue)
            return expression;
        else
            return replacement;
    }

    /// <summary>
    /// Returns replacement value if expression is null
    /// </summary>
    /// <param name="expression"></param>
    /// <param name="replacement"></param>
    /// <returns></returns>
    public static string IsNull(string expression, string replacement)
    {
        if (string.IsNullOrWhiteSpace(expression))
            return replacement;
        else
            return expression;
    }

0
    public static T IsNull<T>(this T DefaultValue, T InsteadValue)
    {

        object obj="kk";

        if((object) DefaultValue == DBNull.Value)
        {
            obj = null;
        }

        if (obj==null || DefaultValue==null || DefaultValue.ToString()=="")
        {
            return InsteadValue;
        }
        else
        {
            return DefaultValue;
        }

    }

//This method can work with DBNull and null value. This method is question's answer

-10

यह एक मजाक के रूप में आधा है, क्योंकि सवाल थोड़े मूर्खतापूर्ण है।

public static bool IsNull (this System.Object o)
{
   return (o == null);
}

यह एक विस्तार विधि है, हालाँकि यह System.Object का विस्तार करती है, इसलिए आपके द्वारा अब उपयोग की जाने वाली प्रत्येक वस्तु में एक IsNull () विधि है।

तब आप कर के टन को बचा सकते हैं:

if (foo.IsNull())

सुपर लंगड़ा के बजाय:

if (foo == null)

इस सवाल का जवाब नहीं है।
बजे एरिक शूनओवर

12
आपको पता नहीं है कि sql सर्वर में ISNULL क्या करता है, फ्लाईस्वाट।
क्लेकॉम्ब

1
हो सकता है कि यह C # में अलग तरीके से काम करता हो, लेकिन मुझे पता है कि VB में यह ऑब्जेक्ट के परीक्षण के लिए काम नहीं करेगा क्योंकि ओपी के बारे में पूछ रहा है। मैंने खुद यह कोशिश की। मैंने System.Object को सिर्फ इतना विस्तार दिया। समस्या यह है कि विस्तार विधि के लिए एक वास्तविक Objectवस्तु की आवश्यकता होती है , जिस पर काम करना होता है, और यदि वस्तु कुछ भी नहीं थी (ठीक वही स्थिति जो आप इस प्रश्न में परीक्षण करना चाहते हैं) तो विस्तार वर्ग के संचालन के लिए कोई उदाहरण नहीं था और इस प्रकार यह होगा NullObject अपवाद फेंकें।
ईडीलोन

@ ईडीलोन ऐसा लगता है जैसे आप Objectवीबी में ए एक्सटेंशन पद्धति पर नहीं पहुंच सकते । देखें इस तो सवाल या इस ब्लॉग पोस्ट
Trisped
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.