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. 1

    为什么Interoperability首先是Binding…

    C 4面对COM、dynamic language和灵活API时,没有放弃static type system,而是允许特定expression把member/overload binding延迟到runtime;同时用optional/named arguments减少冗长signature,用v…

  2. 2

    Dynamic typing

    dynamic 是compile-time signal:相关operation不由normal static binder最终解析,而是生成DLR call site,由C runtime binder根据actual runtime types选择member、overload和conversi…

  3. 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
分步1 / 3

切换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"]);
分步1 / 3

切换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&lt;T&gt;同时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;
分步1 / 3

切换covariant、contravariant、invariant与delegate

本章回顾:方便调用不等于取消Contract

  1. Dynamic把binding延迟到runtime call site,value仍有CLR type,failure也相应后移。
  2. Dynamic adapter应快速返回typed core;cache与performance按实际shape distribution量测。
  3. Optional default由caller baked,named argument让parameter names成为source compatibility surface。
  4. COM syntax减少ceremony,不消除COM lifetime、threading与failure contract。
  5. 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 或运行轨迹以及版本对照验证结论。

讨论

评论区加载中…