web-dev-qa-db-ja.com

null引数をC#メソッドに渡す

Null引数をC#メソッドに渡す方法はありますか(c ++のnull引数のようなもの)?

例えば:

次のc ++関数をC#メソッドに変換することは可能ですか?

private void Example(int* arg1, int* arg2)
{
    if(arg1 == null)
    {
        //do something
    }
    if(arg2 == null)
    {
        //do something else
    }
}
29
Niko Gamulin

はい。 .NETには、参照型と値型の2種類の型があります。

参照型(通常、クラス)は常に参照によって参照されるため、追加の作業なしでnullをサポートします。つまり、変数の型が参照型である場合、変数は自動的に参照になります。

デフォルトでは、値の型(intなど)にはnullという概念はありません。ただし、Nullableと呼ばれるそれらのラッパーがあります。これにより、null不可の値型をカプセル化し、null情報を含めることができます。

ただし、使用方法はわずかに異なります。

// Both of these types mean the same thing, the ? is just C# shorthand.
private void Example(int? arg1, Nullable<int> arg2)
{
    if (arg1.HasValue)
        DoSomething();

    arg1 = null; // Valid.
    arg1 = 123;  // Also valid.

    DoSomethingWithInt(arg1); // NOT valid!
    DoSomethingWithInt(arg1.Value); // Valid.
}
71
Sander

int*に最も近いC#はref int?になると思います。 ref int?により、呼び出されたメソッドが呼び出し元のメソッドに値を戻すことができるためです。

int*

  • Nullでもかまいません。
  • NULL以外で整数値を指すことができます。
  • nullでない場合、値を変更できます。変更は呼び出し元に伝播されます。
  • nullへの設定は、呼び出し元に戻されません

ref int?

  • Nullでもかまいません。
  • 整数値を持つことができます。
  • 値はいつでも変更できます。変更は呼び出し元に伝播します。
  • 値はnullに設定でき、この変更は呼び出し元にも伝播します
6
mackenir

これにはNullableValueTypes(int?など)を使用できます。コードは次のようになります。

private void Example(int? arg1, int? arg2)
{
    if(!arg1.HasValue)
    {
        //do something
    }
    if(!arg2.HasValue)
    {
        //do something else
    }
}
5
MADMap

C#2.0から:

private void Example(int? arg1, int? arg2)
{
    if(arg1 == null)
    {
        //do something
    }
    if(arg2 == null)
    {
        //do something else
    }
}
3
Marcin K

C#2.0からは、nullableジェネリック型Nullableを使用できます。C#には、型の後に?が続く短縮表記があります。

例えば.

private void Example(int? arg1, int? arg2)
{
    if(arg1 == null)
    {
        //do something
    }
    if(arg2 == null)
    {
        //do something else
    }
}
3
user35412

OPの質問はすでに十分に回答されていますが、タイトルは十分に広いので、次の入門書から恩恵を受けると思います。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace consolePlay
{
    class Program
    {
        static void Main(string[] args)
        {
            Program.test(new DateTime());
            Program.test(null);
            //Program.test(); // <<< Error.  
            // "No overload for method 'test' takes 0 arguments"  
            // So don't mistake nullable to be optional.

            Console.WriteLine("Done.  Return to quit");
            Console.Read();
        }

        static public void test(DateTime? dteIn)
        {
            Console.WriteLine("#" + dteIn.ToString() + "#");
        }
    }
}

出力:

#1/1/0001 12:00:00 AM#
##
Done.  Return to quit
2
ruffin

次の2つの方法を使用できます。int?またはNullable、両方とも同じ動作をします。問題なくミックスを作成することもできますが、コードを最もクリーンにするためのより良い選択です。

オプション1(?を使用):

private void Example(int? arg1, int? arg2)
    {
        if (arg1.HasValue)
        {
            //do something
        }
        if (arg1.HasValue)
        {
            //do something else
        }
    }

オプション2(Nullableを使用):

private void Example(Nullable<int> arg1, Nullable<int> arg2)
    {
        if (arg1.HasValue)
        {
            //do something
        }
        if (arg1.HasValue)
        {
            //do something else
        }
    }

C#4.0から、より柔軟に同じことを行うための新しい方法が提供されます。この場合、フレームワークは デフォルト値を持つオプションのパラメーター を提供します。すべてのパラメーター。

オプション3(デフォルト値を使用)

private void Example(int arg1 = 0, int arg2 = 1)
    {
        //do something else
    }
0
juancalbarran