SQL ServerのIsNull()関数に相当するC#


112

SQL Serverでは、IsNull()関数を使用して値がnullかどうかを確認し、nullの場合は別の値を返すことができます。今私はC#に似たものがあるかどうか疑問に思っています。

たとえば、私は次のようなことをしたいです:

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

の代わりに:

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

ありがとう。

回答:


203

これは、ヌル合体(??)演算子と呼ばれます。

myNewValue = myValue ?? new MyValue();

3
null結合演算子を使用しようとしましたが、エラー演算子「??」が引き続き表示されました。タイプ 'bool?'のオペランドには適用できません および 'int'。エラーは誤解を招くものでした。問題は、右側のオペランド位置のintをブール変数に割り当てようとしていたことでした。からに変更する必要がありthis.BinaryExists = vModel.BinaryExists ?? 0;ましたthis.BinaryExists = vModel.BinaryExists ?? false;
Kuyenda

14

悲しいことに、DBNullで機能するnull融合演算子に相当するものはありません。そのためには、三項演算子を使用する必要があります。

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

15
Nitpick:多くの場合、これを三項演算子と呼んでいます。現在のところ、三項演算子はたった1つしかありませんが、それはその名前ではなく、そのプロパティです。これは実際には条件演算子です。C#が別の三項演算子を手に入れたら、混乱する本がたくさんあります。
Jon Skeet、

オブジェクトにdbnullをキャストできます((object)oldValue ??(object)DBNull.Value))
Jeremy Grey

1
@JeremyGray (object)oldValue ?? (object)DBNull.Value)((object)oldValue == null) ? (object)DBNull.Value : (object)oldValue、Robert Rossneyのソリューションが対処する問題とは異なるものと同等です。
2013年

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

myValue.isNull(new MyValue())

このようにして、new MyValue()myValuenullでなくても、実行されます。
S.Serpooshan 2018

4

Equalsメソッドを使用します。

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

この答えは、真または偽のみを返します。これは、OPが要求したものではありません。
Culme

1

DB Nullを操作するために、私はVBアプリケーション用の束を作成しました。それらはVBの組み込みCxxx関数に似ているので、Cxxx2と呼びます。

あなたは私のCLR拡張プロジェクトでそれらを見ることができます

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


CodePlexのすべてのURLを変更したようです。これを試してください:clrextensions.codeplex.com/SourceControl/changeset/view/...
ジョナサン・アレン

0

あなたは2つの関数を書きます

    //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
このコードスニペットは問題を解決する可能性がありますが、なぜまたはどのように質問に答えるかは説明していません。コードの説明を含めてください。これは、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。 報告者/レビュアー: このようなコードのみの回答の場合は、投票しないでください。削除しないでください。
Luca Kiebel、

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");

最初に列が存在するかどうかを確認しています。その列のクエリ結果に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)

これは質問の答えにはなりません。
Eric Sc​​hoonover、

12
SQLサーバーのISNULLが何をするか、FlySwatはわかりません。
ClayKaboom 2011

1
これはC#では動作が異なる可能性がありますが、VBでは、OPが要求しているため、オブジェクトがnullであるかどうかをテストする場合は動作しないことを知っています。自分で試してみました。System.Objectにそのような拡張を加えました。問題は、拡張メソッドが操作する実際のObjectオブジェクトを必要とすることであり、オブジェクトがNothing(正確には、このQでテストしようとしているケース)である場合、操作する拡張クラスのインスタンスがなかったため、 NullObject例外をスローします。
eidylon

@eidylon ObjectVBの拡張メソッドにアクセスできないようです。このSOの質問またはこのブログ投稿を参照してください。
2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.