我正在观看Anders关于C#4.0的讨论和C#5.0的预览,它让我想到C#中何时可以提供可选参数什么是推荐的方法来声明不需要指定所有参数的方法?
例如,FileStream类这样的东西有大约十五种不同的构造函数,它们可以分为逻辑"族",例如下面的字符串,来自a的那些IntPtr和来自a的那些SafeFileHandle.
FileStream(string,FileMode);
FileStream(string,FileMode,FileAccess);
FileStream(string,FileMode,FileAccess,FileShare);
FileStream(string,FileMode,FileAccess,FileShare,int);
FileStream(string,FileMode,FileAccess,FileShare,int,bool);
Run Code Online (Sandbox Code Playgroud)
在我看来,这种类型的模式可以通过改为使用三个构造函数来简化,并使用可以默认的参数的可选参数,这将使构造函数的不同系列更加清晰[注意:我知道这个更改不会是在BCL制作,我正在假设这种情况].
你怎么看?从C#4.0开始,将具有可选参数的紧密相关的构造函数和方法组作为单一方法更有意义,还是有充分理由坚持使用传统的多重载荷机制?
我有一些异步代码,我想添加一个CancellationToken.但是,有许多实现不需要这样做,所以我想有一个默认参数 - 也许是CancellationToken.None.然而,
Task<x> DoStuff(...., CancellationToken ct = null)
Run Code Online (Sandbox Code Playgroud)
产量
类型''的值不能用作默认参数,因为没有标准转换来键入'System.Threading.CancellationToken'
和
Task<x> DoStuff(...., CancellationToken ct = CancellationToken.None)
Run Code Online (Sandbox Code Playgroud)
'ct'的默认参数值必须是编译时常量
有没有办法让CancellationToken有一个默认值?
由于C#添加了可选参数,因此使用可选参数或方法重载被认为是更好的做法,或者是否存在您希望使用其中一个的特定情况.即具有许多参数的函数更适合w /可选参数?
我正在编写和浏览我正在使用的项目中的许多方法,并且尽管我觉得overloads有用,但我认为optional parameter使用带有默认值的简单可以解决问题,帮助编写更具可读性,我认为有效的代码.
现在我听说在这些方法中使用这些参数会产生令人讨厌的副作用.
这些副作用是什么,是否值得使用这些参数来保持代码清洁的风险?
我写了一个函数,递归计算整数n> 1的最小除数:
using System;
public class Program
{
public static void Main()
{
int n = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(SmallestDivisor(n));
}
public static int SmallestDivisor(int n)
{
return SmallestDivisor(n, 2);
}
public static int SmallestDivisor(int n, int d)
{
if (n%d == 0)
return d;
else
return SmallestDivisor(n, d+1);
}
}
Run Code Online (Sandbox Code Playgroud)
我的目标是构建一个递归函数,只接受整数n作为参数.是否有任何可能的替代方法来避免调用另一个辅助函数作为参数整数n和d?