有没有办法将空参数传递给 C# 方法(类似于 c++ 中的空参数)?
例如:
是否可以将以下 c++ 函数转换为 C# 方法:
private void Example(int* arg1, int* arg2)
{
if(arg1 == null)
{
//do something
}
if(arg2 == null)
{
//do something else
}
}
是的。.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.
}
我认为最接近的 C# 等价int*
于ref int?
. 因为ref int?
允许被调用方法将值传递回调用方法。
int*
ref int?
您可以为此使用 NullableValueTypes(如 int?)。代码将是这样的:
private void Example(int? arg1, int? arg2)
{
if(!arg1.HasValue)
{
//do something
}
if(!arg2.HasValue)
{
//do something else
}
}
从 C# 2.0 开始:
private void Example(int? arg1, int? arg2)
{
if(arg1 == null)
{
//do something
}
if(arg2 == null)
{
//do something else
}
}
从 C# 2.0 开始,您可以使用可为空的泛型类型 Nullable,并且在 C# 中有一个简写符号,类型后跟 ?
例如
private void Example(int? arg1, int? arg2)
{
if(arg1 == null)
{
//do something
}
if(arg2 == null)
{
//do something else
}
}
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 种方式: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
}