Chapter 4. C# 4: Improving interoperability
覆盖Dynamic typing、Optional/named arguments、COM interoperability improvements与Generic variance,以binding time和compatibility解释C# 4。
学习目标
- 能比较static、dynamic、object与reflection的binding input、time、cache和exception surface
- 能分析optional/named arguments及COM improvements对caller baking、parameter naming和binary/source compatibility的影响
- 能推导generic interface/delegate中T的input/output位置,判断covariance、contravariance或invariance
机制总览
Chapter 4. C# 4: Improving interoperability:机制路径
- 1
为什么Interoperability首先是Binding…
C 4面对COM、dynamic language和灵活API时,没有放弃static type system,而是允许特定expression把member/overload binding延迟到runtime;同时用optional/named arguments减少冗长signature,用v…
- 2
Dynamic typing
dynamic 是compile-time signal:相关operation不由normal static binder最终解析,而是生成DLR call site,由C runtime binder根据actual runtime types选择member、overload和conversi…
- 3
Optional parameters and named…
Optional parameter的default必须是compile-time可表示值(或特定default form),caller省略时compiler把argument写入call site。Library把default从1改2,未recompile旧consumer仍传1;所以publ…
章级决策实验
Chapter 4. C# 4: Improving interoperability:机制与证据
切换《Chapter 4. C# 4: Improving interoperability》的三个关键教学阶段,先解释机制,再用运行与失败证据验证结论。
选择推理阶段
当前阶段 · 为什么Interoperability首先是Binding…
C 4面对COM、dynamic language和灵活API时,没有放弃static type system,而是允许特定expression把member/overload binding延迟到runtime;同时用optional/named arguments减少冗长signature,用v…
可核验证据
以明确的 LangVersion 与目标框架构建「为什么Interoperability首先是Binding…」的正反案例,并用编译诊断、生成 IL、运行轨迹或分配数据核对实际边界。
学完《Chapter 4. C# 4: Improving interoperability》后,应能从输入和前置条件推导状态变化,并用可重复的构建、运行或边界测试证明结果。
失效—证据矩阵
Chapter 4. C# 4: Improving interoperability:失效与核验
为什么Interoperability首先是Binding…
典型失效
若解释「为什么Interoperability首先是Binding…」时混淆语言规范、编译器降级、运行时和类库责任,版本变化后就会把实现细节误当作 C# 语义保证。
核验证据
以明确的 LangVersion 与目标框架构建「为什么Interoperability首先是Binding…」的正反案例,并用编译诊断、生成 IL、运行轨迹或分配数据核对实际边界。
Dynamic typing
典型失效
若解释「Dynamic typing」时混淆语言规范、编译器降级、运行时和类库责任,版本变化后就会把实现细节误当作 C# 语义保证。
核验证据
以明确的 LangVersion 与目标框架构建「Dynamic typing」的正反案例,并用编译诊断、生成 IL、运行轨迹或分配数据核对实际边界。
Optional parameters and named…
典型失效
若解释「Optional parameters and named…」时混淆语言规范、编译器降级、运行时和类库责任,版本变化后就会把实现细节误当作 C# 语义保证。
核验证据
以明确的 LangVersion 与目标框架构建「Optional parameters and named…」的正反案例,并用编译诊断、生成 IL、运行轨迹或分配数据核对实际边界。
为什么Interoperability首先是Binding责任的转移
C# 4面对COM、dynamic language和灵活API时,没有放弃static type system,而是允许特定expression把member/overload binding延迟到runtime;同时用optional/named arguments减少冗长signature,用variance允许安全constructed-type conversions。每项都在“更易调用”和“何时发现错误”之间交换责任。
先预测:dynamic variable是否没有runtime type;optional default是否由callee每次读取;named argument是否只影响可读性;List<string>是否因covariance可转List<object>。答案都是否。
Dynamic typing
dynamic是compile-time signal:相关operation不由normal static binder最终解析,而是生成DLR call site,由C# runtime binder根据actual runtime types选择member、overload和conversion。Value仍有普通CLR runtime type;把dynamic赋给object后,下一次operation又按object static surface编译。
Call site rules and caching
Call site保存binder与基于已观察type/shape的rules。相同shape重复调用可命中cache,但megamorphic input、跨language object或频繁shape变化会增加binding cost。Performance不能简化为“第一次慢以后免费”,应以代表性type distribution benchmark。
Failure surface
Static typo在compile time失败;dynamic typo到operation执行才抛RuntimeBinderException。因此dynamic应集中在interop adapter,尽快convert/validate到typed domain model。不要让dynamic从boundary扩散到core,使refactor与completion证据消失。
dynamic source = GetInteropObject();
string name = source.Name; // bound at runtime
Customer customer = Parse(name); // typed core resumes here切换static、dynamic、object与reflection
Optional parameters and named arguments
Optional parameter的default必须是compile-time可表示值(或特定default form),caller省略时compiler把argument写入call site。Library把default从1改2,未recompile旧consumer仍传1;所以public optional default是versioned caller contract,而非callee live configuration。
Named arguments按parameter name绑定,可改善多个同型arguments的可读性并与optional组合。Parameter name因此影响source compatibility:library rename虽可能binary compatible,却会让重新编译的named callers失败。Public API evolution需把names纳入review。
Evaluation order仍按arguments在source出现的顺序,不按parameter declaration重新排序;有side effects的named arguments会暴露这一点。Modern code应避免依赖argument evaluation side effect,测试时仍需准确推导。
COM interoperability improvements
C# 4减少COM调用ceremony:optional/named arguments适配大量optional parameters,某些ref可省略,indexed properties更自然,embedded interop types降低部署Primary Interop Assembly压力。Language只改善mapping,COM apartment、HRESULT、lifetime和versioning仍由interop boundary负责。
worksheet.Range["A1", "B4"].Copy(
Destination: worksheet.Range["D1"]);切换optional、named、COM与version场景
Generic variance
Generic variance允许type arguments存在reference conversion时,constructed interface/delegate也有方向安全的conversion。out T表示T只出现在output-safe positions,IEnumerable<string>可当IEnumerable<object>;in T表示input-safe,IComparer<object>可比较strings。
Concrete classes本身不因interface variance变variant,value types也不参与这些reference conversions。List<T>同时add与read,若协变会允许向实际List<string>加入object,因此必须invariant。可以暴露variant read-only interface,而不改变mutable owner。
Delegate binding已有return covariance/parameter contravariance;generic delegate variance进一步允许constructed delegate conversions。二者相关但发生在不同关系层,需写出source method signature、delegate type和constructed conversion三步。
IEnumerable<string> strings = new[] { "a", "b" };
IEnumerable<object> objects = strings;
IComparer<object> objectComparer = Comparer<object>.Default;
IComparer<string> stringComparer = objectComparer;切换covariant、contravariant、invariant与delegate
本章回顾:方便调用不等于取消Contract
- Dynamic把binding延迟到runtime call site,value仍有CLR type,failure也相应后移。
- Dynamic adapter应快速返回typed core;cache与performance按实际shape distribution量测。
- Optional default由caller baked,named argument让parameter names成为source compatibility surface。
- COM syntax减少ceremony,不消除COM lifetime、threading与failure contract。
- Variance只在interface/delegate的safe input/output positions和reference conversions成立;mutable List保持invariant。
练习
问题 1:如何把dynamic第三方对象安全接入typed core?
问题 2:public optional参数从5改10后,为何线上同时出现两个行为?
问题 3:怎样让List<Dog>安全提供给只读Animal consumer?
术语表
名词解释
本章出现的专业名词,用大白话再讲一遍。
- runtime binding contract
- dynamic call site
- caller-baked default
- covariant output position
- contravariant input position
原版目录概念补充核对
以下条目补齐官方目录中容易被示例主线掩盖的概念。它们不重复罗列目录,而是明确每项概念的机制、适用边界和验收证据。
Optional parameters and named arguments:机制、边界与证据
Chapter 4. C# 4: Improving interoperability中的Optional parameters and named arguments必须分清语言规范、编译器实现、运行时行为与基础类库 API 四层责任。固定 C# 语言版本和目标框架,用正向/负向编译案例、必要的 IL 或运行轨迹以及版本对照验证结论。