写点什么

可选参数在.NET 中全面开花

  • 2010 年 7 月 07 日
  • 本文字数:978 字

    阅读完需:约 3 分钟

.NET 一直都支持可选参数,但是 C#语言却并不支持,除了调用 COM 库以外,可选参数通常是被禁止使用的。现在,随着 C# 4 对可选参数的支持,我们可以看到可选参数被越来越多的使用,而不仅仅限于遗留代码中。这些应用包括与动态语言的互操作、只读数据类型,以及 ASP.NET MVC 中的许多地方。

显然,COM 仍然是可选参数的主要用武之地。例如,当你使用 Office 库时,某个函数可能会有超过 20 个参数,手动指定每一个参数是非常不方便的。如果再没有辅助的标记,你就只能通过数参数的个数来确定哪个值对应的是哪个参数了,这非常容易出错。对于不熟悉 COM 的人,你可以想象一下从前主流语言不支持函数重载时的情景,那是一样的感觉。由于包含可选参数的函数和一般的函数没有区别,因此可以很好的解决这个问题。

除了 COM 之外,C#团队还利用 C# 4 作为晚绑定的途径来支持 DLR。事实上,这才是可选参数真正的目的,其他都是附带的便利。由于动态语言没有显式的类型声明,无法基于参数类型进行函数重载,因此可选参数是非常必要的。

随着多核、多处理器计算机的增长,对于同步与并发的讨论也越来越多。只读数据类型以及如何定义它们成为了一个普遍的话题。如果类型中的每个字段都需要被设置,那么标准的构造函数就可以解决问题。但如果类型中的大部分字段都是可选的,就比较麻烦了。重载构造函数可以解决一部分问题,而对于使用 Java 或者旧版本 C#的人来说,他们可能会更倾向于使用 Builder 模式。但如果有了可选参数,只需要一个构造函数就可以解决问题了。ASP.NET MVC 2 中的 Controller 现在可以为 query string 参数设置默认值了。虽然你也可以使用 attribute 来设置,但可选参数是最简洁的办法。

微软为 ASP.NET MVC 推出的新视图引擎 Razor ,在 helper 方法中使用了可选参数。这让 helper 可以包含更多选项的同时,也支持自说明的编码风格。此外,Razor 还会自动将表达式转换为委托,而不需要使用 lambda 或匿名委托的语法。

还有一些我们永远都不希望使用可选参数的地方。CLS 定义了 CLR 的一个子集,所有.NET 语言都要支持这个子集。CLS 就明确定义,不可以依赖可选参数。这意味着可选参数将不会出现在 BCL 中,而且可能也不会出现在今后所有.NET Framework 包含的类库中。但对于 CodePlex 上的非官方类库来说,这条规则不需要严格遵守。

查看英文原文: Optional Parameters Are Gaining Ground in .NET

2010 年 7 月 07 日 21:092053
用户头像

发布了 63 篇内容, 共 21.2 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
发现更多内容

2021年度总结-拥抱变化

wood

300天创作

简单入门计算机网络

宇宙之一粟

计算机网络 2月月更

【优化技术专题】「系统性能调优实战」终极关注应用系统性能调优及原理剖析(下册)

浩宇天尚

性能调优 Java 分布式 优化逻辑 技术职场 1月日更

Kubernetes初学者指南

俞凡

架构 Kubernetes 云原生 2月月更

(2-1/26) 滑雪的准备

mtfelix

300天创作

浅谈 Java 集合框架

宇宙之一粟

java集合总结 1月月更 1 月月更

2021,平(jia)凡(ban)的一年

xiezhr

年终总结 2021 2021年终总结

Windows 和 Linux 上安装 TTF 字体的方法

编程三昧

HTML5, CSS3 1 月月更

特征工程:归一化与标准化

强劲九

Python 人工智能 神经网络 机器学习 scikit-learn

领先元宇宙序列,有Plato Farm一席之地

股市老人币圈新

树概念总结

en

数据结构

ReactNative进阶(四十五):渐变组件 react-native-linear-gradient

No Silver Bullet

React Native 2月月更

ReactNative进阶(四十三):Mac 通过 .bash_profile 文件配置环境变量

No Silver Bullet

Mac 2月月更 .bash_profile

从 TDD 到测试策略

Teobler

前端 TDD 单元测试 测试策略 测试金字塔

聊聊API安全的重要性及治理思路

陈俊

安全 API 应用架构

ReactNative进阶(四十四):Mobile App 适配性优化

No Silver Bullet

React Native 适配 1月月更

Plato Farm深耕GameFi赛道,2022年是否成为顶级元宇宙代表之一?

芒果甩流氓

顶级元宇宙是否有Plato Farm?

BlockChain先知

WebRTC 流媒体常见开源方案综述 | 社区征文

liuzhen007

音视频 新春征文 2月月更

ReactNative进阶(四十六):移动端实现字体自适应

No Silver Bullet

自适应 React Native 2月月更

Mybatis技术专题之MybatisPlus自带强大功能之多租户插件实现原理和实战分析

浩宇天尚

多租户 MyBatisPlus 2月日更 多租户技术

Plato Farm是否已经步入顶级元宇宙的行列?

石头财经

在线格式时间计算时间差

入门小站

工具

Plato Farm走在元宇宙前列,未来空间依旧

区块链小八歌

Java NIO为何导致堆外内存OOM了?

JavaEdge

2月月更

Promise 基本方法的简单实现

编程三昧

JavaScript Promise 1 月月更

Linux之killall命令

入门小站

Linux

Java9特性-响应式流(Reactive Stream)

蜜糖的代码注释

Java 响应式 响应式编程 2月月更

微服务架构实践原则

俞凡

架构 微服务

我的7年测开生涯

夏兮。

测试开发 外企

微信朋友圈高性能复杂度分析

唐尤华

架构实战营

可选参数在.NET中全面开花-InfoQ