36

有没有办法将空参数传递给 C# 方法(类似于 c++ 中的空参数)?

例如:

是否可以将以下 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 中有两种类型:引用类型和值类型。

引用类型(通常是类)总是由引用引用,因此它们支持 null 而无需任何额外工作。这意味着如果变量的类型是引用类型,则该变量自动成为引用。

默认情况下,值类型(例如 int)没有 null 的概念。但是,它们有一个称为 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.
}
于 2008-11-07T09:19:24.803 回答
9

我认为最接近的 C# 等价int*ref int?. 因为ref int?允许被调用方法将值传递回调用方法。

int*

  • 可以为空。
  • 可以为非 null 并指向一个整数值。
  • 如果不为 null,则可以更改值,并将更改传播给调用者。
  • 设置为 null 不会传回给调用者

ref int?

  • 可以为空。
  • 可以有一个整数值。
  • 值总是可以更改的,并且更改会传播给调用者。
  • 值可以设置为 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

从 C# 2.0 开始,您可以使用可为空的泛型类型 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 回答
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

您可以使用 2 种方式:int? 或 Nullable,两者具有相同的行为。您可以毫无问题地进行混合,但更好的选择是使代码最干净。

选项 1(带?):

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

选项 2(可以为空):

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 回答