C#:函数参数指定默认值

在C#中,可以为函数参数指定默认值,这样调用函数时可以不传递该参数,而是使用默认值。这对于简化API调用和提高代码的可读性非常有帮助。从C#6.0开始,可以直接在方法签名中为参数指定默认值,而不需要使用可选参数的特性(`Optional`)。

示例

假设有一个计算折扣价格的函数,可以为折扣率参数设置一个默认值,例如10%的折扣。

示例代码(C#6.0及以后)

public class Product

{

public string Name { get; set; }

public decimal Price { get; set; }

}

public class DiscountCalculator

{

public decimal CalculateDiscountedPrice(decimal price, decimal discountRate = 0.1m)

{

return price * (1 - discountRate);

}

}

在上面的代码中,`CalculateDiscountedPrice` 方法接受两个参数:`price` 和 `discountRate`。`discountRate` 有一个默认值 `0.1m`,这意味着如果在调用这个方法时没有提供 `discountRate`,它将默认使用10%的折扣率。

使用示例

var calculator = new DiscountCalculator();

var product = new Product { Name = "Example Product", Price = 100m };

// 使用默认折扣率10%

var priceWithDefaultDiscount = calculator.CalculateDiscountedPrice(product.Price);

Console.WriteLine($"Price with default discount: {priceWithDefaultDiscount}");

// 指定一个不同的折扣率

var priceWithCustomDiscount = calculator.CalculateDiscountedPrice(product.Price, 0.2m); // 20%折扣率

Console.WriteLine($"Price with custom discount: {priceWithCustomDiscount}");

注意事项

  • 默认值只能是常量表达式:默认值必须是编译时常量,例如字面量或常量字段。它不能是运行时计算得出的值或依赖于其他参数的值。

  • 从C#7.1开始:可以为引用类型参数提供 `null` 作为默认值,例如 `string name = null`。这在希望明确区分"未设置"和"空字符串"的情况时特别有用。

  • 可选参数:尽管从C#6.0开始可以在方法签名中直接指定默认值,但如果使用的是早期版本的C或者出于某种原因需要使用旧式的可选参数语法,可以这样做:

public decimal CalculateDiscountedPrice(decimal price, Optional decimal discountRate = 0.1m)

{

return price * (1 - discountRate);

}

相关推荐
1314lay_10078 分钟前
C#调用Sql Server存储过程,有返回值的
数据库·sqlserver·c#
我是唐青枫13 分钟前
C#.NET PInvoke 深入解析:封送、内存布局与原生互操作实战
开发语言·c#·.net
程序猿编码22 分钟前
纯C++轻量计算机视觉推理引擎:基于GGML的端侧CV模型部署技术全解析
开发语言·c++·计算机视觉·大模型·transformer
Am-Chestnuts31 分钟前
AI 生成的数学公式,怎么用 DS随心转 导出成 Word 里能改的公式
人工智能·c#·word
SEO_juper40 分钟前
外贸多语言站最隐蔽的流量杀手:hreflang 错了,谷歌把德语页推给美国人(附审计脚本)
开发语言·前端·python·seo·独立站·谷歌优化
geovindu1 小时前
CSharp: Strategy Pattern
开发语言·后端·c#·.net·.netcore·策略模式·行为模式
古少侠1 小时前
AI 内容粘到 Word 就乱?用 DS随心转 把复制的内容直接变成排版好的一段
人工智能·c#·word
Tairitsu_H1 小时前
[C++] C++11新增构造:列表初始化和std::initializer_list
开发语言·c++·c++11·构造
宣宣猪的小花园.1 小时前
【嵌入式】故障与降级:看门狗、保护机制和工程可靠性的底线
开发语言·人工智能·嵌入式硬件·机器学习
shmily麻瓜小菜鸡2 小时前
JS/TS 易踩坑知识点 — 自动分号插入(ASI)
开发语言·javascript·ecmascript