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

我选择了第二个选项,效果非常好,谢谢。)我选择了第二个选项,效果非常好,谢谢。)(这是因为可选参数值在编译时烘焙到调用站点中)(这是因为可选参数值在编译时烘焙到调用站点中)