36

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

例えば:

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

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

7 に答える 7

86

はい。.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.
}
于 2008-11-07T09:19:24.803 に答える
9

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

int*

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

ref int?

  • nullにすることができます。
  • 整数値を持つことができます。
  • 値はいつでも変更でき、変更は呼び出し元に伝播されます。
  • 値はnullに設定でき、この変更は呼び出し元にも伝播されます。
于 2008-11-07T10:00:37.247 に答える
7

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

private void Example(int? arg1, int? arg2)
{
    if(!arg1.HasValue)
    {
        //do something
    }
    if(!arg2.HasValue)
    {
        //do something else
    }
}
于 2008-11-07T09:16:09.070 に答える
5

C# 2.0 から:

private void Example(int? arg1, int? arg2)
{
    if(arg1 == null)
    {
        //do something
    }
    if(arg2 == null)
    {
        //do something else
    }
}
于 2008-11-07T09:15:40.460 に答える
3

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
    }
于 2015-07-16T22:07:33.547 に答える
3

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
于 2012-12-05T14:02:45.563 に答える
3

C# 2.0 以降では、null 許容ジェネリック型 Nullable を使用できます。C# では、型の後に ? が続く簡略表記があります。

例えば

private void Example(int? arg1, int? arg2)
{
    if(arg1 == null)
    {
        //do something
    }
    if(arg2 == null)
    {
        //do something else
    }
}
于 2008-11-07T09:17:07.867 に答える