Adj*_*jit 14 c# class optional-parameters
我知道这可以使用,null
所以我有一个解决方法,但我想知道是否有更好的方法,我可以有int[]
一个类的可选参数?
class PriceLevels
{
public int[] priceLevels { get; }
private readonly int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 };
public PriceLevels(int[] newPriceLevels = defaultPriceLevels)
{
priceLevels = newPriceLevels;
}
}
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误,说它是一个无效的表达式defaultPriceLevels
必须是常量.我怎样才能解决这个问题?
我可以解决的一个解决方法就是这个,但我真的不喜欢这个解决方案
class PriceLevels
{
public int[] priceLevels { get; }
private readonly int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 };
public PriceLevels(int[] newPriceLevels = null)
{
if(newPriceLevels == null)
priceLevels = defaultPriceLevels;
else
priceLevels = newPriceLevels;
}
}
Run Code Online (Sandbox Code Playgroud)
Gil*_*een 17
一个更好的设计就是拥有2个构造函数(构造函数重载),一个获取a int[]
,另一个不获取:
class PriceLevels
{
public int[] priceLevels { get; set; }
private readonly int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 };
public PriceLevels()
{
priceLevels = defaultPriceLevels;
}
public PriceLevels(int[] newPriceLevels)
{
priceLevels = newPriceLevels;
}
}
Run Code Online (Sandbox Code Playgroud)
如果没有,不知道我是否称之为"更好",但你可以使用params
关键字:
class PriceLevels
{
public int[] priceLevels { get; set; }
private readonly int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 };
public PriceLevels(params int[] newPriceLevels)
{
priceLevels = newPriceLevels.Length == 0 ? defaultPriceLevels : newPriceLevels;
}
}
Run Code Online (Sandbox Code Playgroud)
此外,根据设计,我不相信PriceLevels
确定默认值是什么是责任,并且可能在任何情况下都应该将其作为依赖项 - 请参阅SOLID和依赖注入.然后你只有1个构造函数:
class PriceLevels
{
public int[] priceLevels { get; set; }
public PriceLevels(int[] newPriceLevels)
{
priceLevels = newPriceLevels;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以重载构造函数.
class PriceLevels
{
public int[] priceLevels { get; private set; }
private readonly int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 };
public PriceLevels()
{
priceLevels = defaultPriceLevels;
}
public PriceLevels(int[] newPriceLevels)
{
priceLevels = newPriceLevels;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以创建另一个没有参数的构造函数,只需将defaultPriceLevels变量传递给您已有的构造函数?您还必须将变量更改为静态.
例如
class PriceLevels
{
public int[] priceLevels { get; }
private static int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 };
public PriceLevels(int[] newPriceLevels = null)
{
if (newPriceLevels == null) priceLevels = defaultPriceLevels;
else priceLevels = newPriceLevels;
}
public PriceLevels() : this(defaultPriceLevels)
{ }
}
Run Code Online (Sandbox Code Playgroud)
Crowd :)中的另一个选项,它最接近您的原始代码
class PriceLevels
{
public int[] priceLevels { get; set; }
private readonly int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 };
public PriceLevels(int[] newPriceLevels = null)
{
priceLevels = newPriceLevels ?? defaultPriceLevels;
}
}
Run Code Online (Sandbox Code Playgroud)