C# 方法中的默认值
我想有一个默认值的方法 接口:C# 方法中的默认值,c#,C#,我想有一个默认值的方法 接口: public interface IMyFormatter { Bitmap Generate(string number, int width, int height); } 混凝土等级: public class DefaultFormatter : IMyFormatter { private const int DEFAULT_BARCODE_WIDTH = 148; pri
public interface IMyFormatter
{
Bitmap Generate(string number, int width, int height);
}
混凝土等级:
public class DefaultFormatter : IMyFormatter
{
private const int DEFAULT_BARCODE_WIDTH = 148;
private const int DEFAULT_BARCODE_HEIGHT = 20;
private const TYPE DEFAULT_BARCODE_TYPE = TYPE.CODE128;
public Bitmap Generate(string Number, int Width = DEFAULT_BARCODE_WIDTH,
int Height = DEFAULT_BARCODE_HEIGHT)
{
var zoneBarcode = new Barcode(Number, DEFAULT_BARCODE_TYPE);
return new Bitmap(zoneBarcode.Encode(DEFAULT_BARCODE_TYPE, zoneBarcode.RawData, barcodeWidth, barcodeHeight));
}
用法:
var number = "1000";
var barcodeToPrint =_barcodeFormatter.Value.Generate(number);
我尝试这样修改接口(并将类中的方法调整为int?):
但我的类中的值是null,而不是默认值,我得到了异常 选项1:将默认值放入界面中。为此,您可能需要将常量提取到另一个类中,该类可以从
IMyFormatter
和DefaultFormatter
访问(因为接口上不能定义常量):
请注意,为了支持其他一些CLR语言,例如IronPython,您还需要该方法中的默认值:
public class DefaultFormatter : IMyFormatter
{
public Bitmap Generate(
string number,
int width = FormatterDimensions.DEFAULT_BARCODE_WIDTH,
int height = FormatterDimensions.DEFAULT_BARCODE_HEIGHT)
{
}
}
选项2:改用
int?
。您需要在接口和实现上执行此操作:
public interface IMyFormatter
{
Bitmap Generate(string number, int? width = null, int? height = null);
}
public class DefaultFormatter : IMyFormatter
{
private const int DEFAULT_BARCODE_WIDTH = 148;
private const int DEFAULT_BARCODE_HEIGHT = 20;
public Bitmap Generate(string number, int? width = null, int? height = null)
{
int actualWidth = width ?? DEFAULT_BARCODE_WIDTH;
int actualHeight = height ?? DEFAULT_BARCODE_HEIGHT;
// Use actualWidth and actualHeight in your code
}
}
选项1:将默认值放入界面中。为此,您可能需要将常量提取到另一个类中,该类可以从
IMyFormatter
和DefaultFormatter
访问(因为接口上不能定义常量):
请注意,为了支持其他一些CLR语言,例如IronPython,您还需要该方法中的默认值:
public class DefaultFormatter : IMyFormatter
{
public Bitmap Generate(
string number,
int width = FormatterDimensions.DEFAULT_BARCODE_WIDTH,
int height = FormatterDimensions.DEFAULT_BARCODE_HEIGHT)
{
}
}
选项2:改用
int?
。您需要在接口和实现上执行此操作:
public interface IMyFormatter
{
Bitmap Generate(string number, int? width = null, int? height = null);
}
public class DefaultFormatter : IMyFormatter
{
private const int DEFAULT_BARCODE_WIDTH = 148;
private const int DEFAULT_BARCODE_HEIGHT = 20;
public Bitmap Generate(string number, int? width = null, int? height = null)
{
int actualWidth = width ?? DEFAULT_BARCODE_WIDTH;
int actualHeight = height ?? DEFAULT_BARCODE_HEIGHT;
// Use actualWidth and actualHeight in your code
}
}
调用接口的方法和调用类的方法是不同的 举个例子:
public interface IMyFormatter
{
object Generate(string number, int? width = null, int? height = null);
}
public class DefaultFormatter : IMyFormatter
{
private const int DEFAULT_BARCODE_WIDTH = 148;
private const int DEFAULT_BARCODE_HEIGHT = 20;
private const string DEFAULT_BARCODE_TYPE = "TYPE.CODE128";
public object Generate(string Number, int? Width = DEFAULT_BARCODE_WIDTH, int? Height = DEFAULT_BARCODE_HEIGHT)
{
Console.WriteLine(Number);
Console.WriteLine(Width);
Console.WriteLine(Height);
return new object();
}
}
因此,当您现在为DefaultFormatter
创建一个新对象并调用Generate()
但是,如果使用接口类型调用它,将得到以下输出:
((IMyFormatter) formatter).Generate("100");
// Output: 100
// Output: null
// Output: null
当您创建类作为接口类型时,将获得相同的输出
IMyFormatter formatter= new DefaultFormatter();
formatter.Generate("100");
// Output: 100
// Output: null
// Output: null
调用接口的方法和调用类的方法是不同的 举个例子:
public interface IMyFormatter
{
object Generate(string number, int? width = null, int? height = null);
}
public class DefaultFormatter : IMyFormatter
{
private const int DEFAULT_BARCODE_WIDTH = 148;
private const int DEFAULT_BARCODE_HEIGHT = 20;
private const string DEFAULT_BARCODE_TYPE = "TYPE.CODE128";
public object Generate(string Number, int? Width = DEFAULT_BARCODE_WIDTH, int? Height = DEFAULT_BARCODE_HEIGHT)
{
Console.WriteLine(Number);
Console.WriteLine(Width);
Console.WriteLine(Height);
return new object();
}
}
因此,当您现在为DefaultFormatter
创建一个新对象并调用Generate()
但是,如果使用接口类型调用它,将得到以下输出:
((IMyFormatter) formatter).Generate("100");
// Output: 100
// Output: null
// Output: null
当您创建类作为接口类型时,将获得相同的输出
IMyFormatter formatter= new DefaultFormatter();
formatter.Generate("100");
// Output: 100
// Output: null
// Output: null
我选择了第二个选项,效果非常好,谢谢。)我选择了第二个选项,效果非常好,谢谢。)(这是因为可选参数值在编译时烘焙到调用站点中)(这是因为可选参数值在编译时烘焙到调用站点中)