Передача нулевых аргументов в методы C # - PullRequest
29 голосов
/ 07 ноября 2008

Есть ли способ передать нулевые аргументы в методы C # (что-то вроде нулевых аргументов в c ++)?

Например:

Можно ли перевести следующую функцию c ++ в метод C #:

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

Ответы [ 7 ]

71 голосов
/ 07 ноября 2008

Да. В .NET есть два типа типов: ссылочные типы и типы значений.

Типы ссылок (обычно классы) всегда упоминаются ссылками, поэтому они поддерживают ноль без дополнительной работы. Это означает, что если тип переменной является ссылочным типом, переменная автоматически становится ссылкой.

Типы значений (например, int) по умолчанию не имеют понятия нуля. Тем не менее, есть обертка для них под названием Nullable. Это позволяет вам инкапсулировать ненулевой тип значения и включать нулевую информацию.

Хотя использование немного отличается.

// 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.
}
6 голосов
/ 07 ноября 2008

Я думаю, что ближайший C #, эквивалентный <strong>int*</strong>, будет <strong>ref int?</strong>. Потому что <strong>ref int?</strong> позволяет вызываемому методу передавать значение обратно вызывающему методу.

<strong>int*</strong>

  • Может быть нулевым.
  • Может быть ненулевым и указывать на целочисленное значение.
  • Если не ноль, значение может быть изменено , и изменение распространяется на вызывающую сторону.
  • Установка на ноль не передается вызывающей стороне .

<strong>ref int?</strong>

  • Может быть нулевым.
  • Может иметь целочисленное значение.
  • Значение всегда можно изменить , и это изменение распространяется на вызывающую сторону.
  • Значение может быть установлено равным нулю, и это изменение также будет распространяться на вызывающего абонента .
5 голосов
/ 07 ноября 2008

Вы можете использовать NullableValueTypes (например, int?) Для этого. Код будет выглядеть так:

private void Example(int? arg1, int? arg2)
{
    if(!arg1.HasValue)
    {
        //do something
    }
    if(!arg2.HasValue)
    {
        //do something else
    }
}
3 голосов
/ 07 ноября 2008

Начиная с 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 голосов
/ 07 ноября 2008

из C # 2.0:

private void Example(int? arg1, int? arg2)
{
    if(arg1 == null)
    {
        //do something
    }
    if(arg2 == null)
    {
        //do something else
    }
}
2 голосов
/ 05 декабря 2012

На вопрос ОП уже получен хороший ответ, но заголовок достаточно широк, так что я думаю, что ему полезен следующий учебник:

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
0 голосов
/ 17 июля 2015

Вы можете использовать 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
    }
...