“AI 技术+人才”如何成为企业增长新引擎?戳此了解>>> 了解详情
写点什么

分部方法:应该纳入到 C#中吗?

  • 2007-09-09
  • 本文字数:1212 字

    阅读完需:约 4 分钟

C#新增的特性中引起争议的有许多,分部方法(Partial Method)算是一个。分部方法通常被定义在一个分部类中,在常规的类文件中也可实现。如果分部方法没有被实现,编译器就不会、对他们进行编译。

分部方法有着严格的限制。它们必须是私有的,不能返回值,不能有输出参数。因为任何针对没有被实现的分部方法的调用都会简单地被忽略,所以说这些限制是非常有必要的。反过又意味着,分部方法不能作为一个明确分配的变量。Visual Basic 也有分部方法,尽管 VB 不需要对变量的明确分配,它也有同样的限制。

有那么多的限制,有人可能会问,“它们有什么优点?”。这个问题问得好,基本上,分部方法仅被代码生成器在处理轻量级事件的时候使用。就像 Alexander Jung 所解释的 :

分部方法通常(也可能是唯一相关的)的应用场景就是在代码生成的时候用于处理轻量级事件。假设你解析一个数据库或者一个 XML 文件,然后生成了数据类,结果你会发现有数十个类、几百个属性以及一大堆泛型和模板文件等。分部方法另外一个经常被用到的地方是验证,或者让属性的 setter 去更新另一个属性。所以如果你要使用产生的代码,或者在运行时有几百个事件和数千个方法调用的话( 其实大多数情况下只用到了其中的一点点),就让分部方法来吧。分部方法在声明和使用时要比事件容易得多,如果没有用到它们,它们就会消失。

性能的提升并不是没有代价的。从分部方法必须是私有的限制中,Alexander 发现了它们的不足之处:

缺点:如果你喜欢元数据驱动的应用,并且已经被 ASP.NET 的数据绑定所困扰时(因为没有其他的方法可以附上元数据)……那么,就准备着在将来丢失信息吧。如果你需要为属性的 setter 增加一些事件(基于跟踪和调试的需要),如果你需要某个动态的行为(比如附上某个通用规则引擎)等等,那么就让我们祈祷代码分析器的开发人员能够预知这个场景(或者已经做好了准备)吧。你有了一个清晰的层的分离,那么实体就应该对 UI 一无所知吗?是的,将代码直接放到数据类中会破坏层的关系,但是你可以手动地用分部方法实现真正的事件啊。

另外一些人对于 C#中的分部方法也是忧虑重重,大部分是关于代码设计器的使用的。Stefan Wenig 写道:

首先,我不是非常热衷于设计器。我忧虑的是设计器也许很快就会将我们送上过去基于 COM 开发时的老路,数百个设计器和向导产生了那么多没人想去看的 ATL 和 MCF 代码。在我们陷于设计器、创建的无用文件和复杂的构建过程时,使用 Ruby 的家伙们在笑,因为他们用几行代码就可以解决(联想一下上世纪 90 年代 COM/C++ 和 Java 的比较)。难道对于基于代码的开发人员生产率不是 C#所首要考虑的(看看 VB 的设计器驱动的 RAD 路线图)?我们不应该再沉浸于基于设计器的,企业类库思想的,乐于使用软件工厂代码设计器的幻想中了。团结起来,抵制它们!

Ayende Rahien 也没有嘴软:

让我们一起埋葬这些代码设计器吧,竖起分部方法的辉煌墓碑!

查看英文原文: Partial Methods: Do They Belong in C#?

2007-09-09 21:40756

评论

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

IT行业的前世今生,一文吃透“风口上”的低代码

这我可不懂

低代码 低代码平台 JNPF

OpenKruise 开发者不容错过的带薪实习机会!马上加入 LFX Mentorship 计划

阿里巴巴中间件

阿里云 开源 云原生 OpenKruise

软件测试/测试开发 | 测试平台开发-前端开发之Vue.js 框架的使用

测试人

BI工具数据看板对比:瓴羊Quick BI与Smart BI

流量猫猫头

架构训练营-模块六作业

Sam

架构实战营

SkyWalking实现 Dubbo 微服务实现链路跟踪案例以及对接钉钉告警

忙着长大#

极客时间

「Go框架」平滑关闭:要关闭服务,未处理完的请求怎么办?

Go学堂

golang 个人提升 平滑重启 程序员、 gin框架

Matlab实现图像压缩

timerring

图像处理 图像压缩

2022 IoTDB Summit:阿里白渐《迈向物联网时代大数据计算平台——MaxCompute 基于IoTDB构建解决方案》

Apache IoTDB

大数据 时序数据库 IoTDB

更高效、更实用的跨端开发选择

FinFish

flutter finclip 小程序容器 跨端框架

使用 Pulumi 打造自己的多云管理平台

亚马逊云科技 (Amazon Web Services)

Amazon S3

「Go工具箱」Pie :一个高性能、类型安全的slice操作库

Go学堂

golang 开源 程序员 个人成长

微服务引擎 MSE 企业版全新升级

阿里巴巴中间件

阿里云 微服务 云原生

拆分电商系统为微服务

Geek_e5f2e5

OpenHarmony技术峰会举办“编程语言及应用框架分论坛” ,探讨应用开发新技术

Geek_2d6073

BaseAdapter优化

攻城狮Wayne

ConversionService baseadapter viewholder

王者荣耀商城异地多活架构设计

Geek_e5f2e5

我,30岁程序员被裁员了,千万别干全栈

程序员晚枫

程序员 裁员 大龄求职

2022 IoTDB Summit:华为王超《Apache IoTDB 在华为云的实践》

Apache IoTDB

大数据 开源 时序数据库 IoTDB

开心档之Swift 访问控制访问控制

雪奈椰子

开心档

2022年证券行业年度专题分析

易观分析

金融 证券 经济

设计消息队列存储消息数据的 MySQL 表格

Geek_e5f2e5

低代码生成器 | 放开双手,专注业务,一键生成项目基础结构 + 重复代码

IT学习日记

开源项目 脚手架 代码自动生成 自动搭建项目

浅谈基于Web的跨平台桌面应用开发

京东科技开发者

Web 跨平台 nodejs 桌面端 企业号 3 月 PK 榜

2023金融科技四大机遇与挑战

易观分析

金融科技 金融 经济

ChatGPT 是真的银弹吗? | 社区征文

宇宙之一粟

Go 思考 后端 征文投稿 ChatGPT

三天吃透mybatis面试八股文

程序员大彬

Java mybatis

旺链科技荣获科创中国数字经济技术创新峰会多个奖项

旺链科技

区块链+ 区块链、

纵存科技加入龙蜥社区,共建高性能存储软件栈

OpenAnolis小助手

开源 合作伙伴 龙蜥社区 CLA 纵存科技

WindowsGUI自动化测试框架搭建之需求整理、详细设计和框架设计

Python 自动化测试 测试框架 WindowsGUI UIaotumation

RISC-V SIG 创建专属邮件列表和论坛板块

openEuler

Linux 操作系统 openEuler risc-v

分部方法:应该纳入到C#中吗?_.NET_Jonathan Allen_InfoQ精选文章