Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可选参数_C#_.net_Optional Parameters - Fatal编程技术网

C# 可选参数

C# 可选参数,c#,.net,optional-parameters,C#,.net,Optional Parameters,我有一个方法,它接受一组可选参数,我正在重载该方法以提供不同的签名组合。Intellisense弹出了一组不同的签名,但我认为现在看起来很混乱,因为我需要提供不同的组合,而不仅仅是在方法签名的末尾建立参数 我是否应该不重载我的方法并坚持使用一个签名,以便我的方法的用户必须传递空值?这会使签名更清晰,但会使调用代码看起来更混乱。您是否仅限于使用C#1-3?C#4支持可选参数和命名参数 在此之前,您可能应该坚持重载,或者创建一个具有可变属性的单独类,例如 FooOptions options = n

我有一个方法,它接受一组可选参数,我正在重载该方法以提供不同的签名组合。Intellisense弹出了一组不同的签名,但我认为现在看起来很混乱,因为我需要提供不同的组合,而不仅仅是在方法签名的末尾建立参数


我是否应该不重载我的方法并坚持使用一个签名,以便我的方法的用户必须传递空值?这会使签名更清晰,但会使调用代码看起来更混乱。

您是否仅限于使用C#1-3?C#4支持可选参数和命名参数

在此之前,您可能应该坚持重载,或者创建一个具有可变属性的单独类,例如

FooOptions options = new FooOptions { Name="Jon", Location="Reading" };
Foo foo = new Foo(options);
这一切都可以在一个声明中完成,如果你想。。。如果某些属性是必需的,那么在
fooptions
中创建一个构造函数,该构造函数接受所有属性

在C#4中,您可以编写:

Foo foo = new Foo(name: "Jon", location: "Reading");
如果构造函数编写为

public Foo(string name,
           int age = 0,
           string location = null,
           string profession = null)

命名参数和可选参数应该使在C#4:)中构造具有可选属性的不可变类型变得更容易。

您是否仅限于使用C#1-3?C#4支持可选参数和命名参数

在此之前,您可能应该坚持重载,或者创建一个具有可变属性的单独类,例如

FooOptions options = new FooOptions { Name="Jon", Location="Reading" };
Foo foo = new Foo(options);
这一切都可以在一个声明中完成,如果你想。。。如果某些属性是必需的,那么在
fooptions
中创建一个构造函数,该构造函数接受所有属性

在C#4中,您可以编写:

Foo foo = new Foo(name: "Jon", location: "Reading");
如果构造函数编写为

public Foo(string name,
           int age = 0,
           string location = null,
           string profession = null)

命名参数和可选参数应该使在C#4:)中构造具有可选属性的不可变类型容易得多。

想想C#方法的参数


想想c#方法的params参数


如果函数定义仅在长度上变化(而不是顺序,否则这不是最佳方法),则可以使用。然后,在函数中,您可以根据参数输入设置所需的值。

如果函数定义仅在长度上变化(而不是顺序,否则这不是最佳方法),则可以使用.然后在函数中,您可以根据参数输入设置所需的值

是的,在c#2上,我恐怕必须等待c#4和可选参数。是的,这将非常方便,在c#2上,我恐怕必须等待c#4和可选参数。是的,这确实是一种错误的方法:除非所有参数都是同一类型,否则您将失去类型安全性,并且您将失去关于哪个参数意味着什么的任何线索。这将使您失去类型安全性,并且需要对值类型进行装箱。这两种方法通常都不可取。几乎可以肯定的是,错误的方法是:除非所有参数都是相同的类型,否则将失去类型安全性,并且将失去关于哪个参数意味着什么的任何线索。这将使您失去类型安全性,并需要对值类型进行装箱。两者都是不理想的。只有在参数相同的情况下,我才会考虑<代码> PARAMS < /C>。另见Jon对另一个答案的评论。是的,这就是我刚才提到的,只有当类型顺序相同时,这才真正起作用。否则,Jon的答案就是解决问题的方法。这在我的情况下是行不通的,因为我需要一个固定的签名。如果我传递的数据需要数组形式的字符串,那就很好了。只有当参数是相同类型时,FrimATI才会考虑<代码> PARAMS < /代码>。另见Jon对另一个答案的评论。是的,这就是我刚才提到的,只有当类型顺序相同时,这才真正起作用。否则,Jon的答案就是解决问题的方法。这在我的情况下是行不通的,因为我需要一个固定的签名。如果我以字符串.Format这样的数组形式传入一些我需要的数据,那就好了