title author date CreateTime categories
从 dotnet core 3.0 的特性让 WPF 布局失效讨论 API 兼容
lindexi
2019-4-17 10:5:35 +0800
2019-04-17 09:41:42 +0800
WPF dotnet

在 dotnet core 3.0 为了支持 IEEE 浮点数计算标准,修改了 Math.Max 的算法,于是在 WPF 的 Track 里面的布局依赖于之前的计算,于是在 dotnet core 3.0 的修改就让布局计算不对了。改动现有 API 的行为会让现有的代码出现不兼容问题,那么要让一个框架能稳定支持升级需要满足什么条件

在我准备睡的过程,某 神樹 桜乃 告诉我现在的 Math.Max 对于 0 和 NaN 的返回和之前不一样,于是在他的帮助下,我找到了dotnet core 3.0 的新特性,符合 IEEE 标准的浮点计算的提交 在这个提交里面,作者说明了这个提交将会是改变 API 行为的

于是刚好在 WPF 的 Slider 用到了 Track 的布局,刚好在布局里面就依赖了 Math.Max(0,NaN) 返回 的是 NaN 而不是 0 的坑,详细请看 神樹的回复

本来 dotnet core 遵守 IEEE 标准是好的,因为有一个标准可以让多个语言迁移成本降低,但是在 .NET Framework 已经用了这个坑很久了,没有人能说明有多少以前的代码会依赖于这个坑。于是修改 dotnet core 3.0 浮点计算的作者就提议不更改原有的 API 的行为,另外新增新的 API 而不是改变原有的 API 用来兼容现在的代码,请看Expose Math.MaxNumber and Math.MinNumber functions that don't propagate NaN

我十分同意一个稳定的框架的 API 设计是能做到上下兼容的,一个不兼容的 API 只需要满足以下条件

  • 接口更改,包含方法或属性名等的变更
  • 返回值更改
  • 公开属性更改,包括属性类型和属性可访问
  • 公开 API 行为修改
  • 方法参数变更,包含参数类型和参数个数

作为一个公开的框架,将会有很多历史问题,一个发布出去的 API 将会被很多小伙伴在很多地方使用,如果变更了不兼容的 API 从版本号规范上,需要升级主版本号。在版本号规则,升级主版本号就是表示存在 API 不兼容,基本上就是需要修改现在的代码才能跑起来。而升级次版本号就是表示有新增的 API
可以不更改原有的代码就可以升级库。也就是只要不是主版本号更改,那么就是愉快升级库而不需要考虑兼容

作为超级多项目引用的基础 dotnet core 库是需要做到上下兼容的,任何很小的 API 不兼容都需要其他很多项目很大的兼容代价

如何设计一个好的框架,请看好的框架需要好的 API 设计 —— API 设计的六个原则 - walterlv

现在 WPF 和 dotnet core 都是开源的,如果遇到任何的问题都可以在社区上询问

Some cleanup of the Math functions from #20788 by tannergooding · Pull Request #20912 · dotnet/coreclr

Expose Math.MaxNumber and Math.MinNumber functions that don't propagate NaN · Issue #36925 · dotnet/corefx

Problem with WPF's Slider style (and a few thoughts on porting DX11 rendering engine to Core3) · Issue #521 · dotnet/wpf

2019-4-17-从-dotnet-core-3.0-的特性让-WPF-布局失效讨论-API-兼容的更多相关文章

  1. DotNet Core 1.0 集成 CentOS 开发与运行环境部署

    一.     DotNet Core 1.0 开发环境部署 操作系统安装 我们使用CentOS 7.2.1511版本. 安装libunwind库 执行:sudo yum install libunwi ...

  2. 北京时间28号0点以后Scott Hanselman同志台宣布dotnet core 1.0 rtm

    今日占住微信号头条的好消息<终于来了!微软.Net Core 1.0下载放出>.本人立马跑到官网http://dot.net看了一下,仍然是.net core 1.0 Preview 1版 ...

  3. centos 7 && dotnet core 2.0 && nginx && supervisor

    前提 系统:centos 7 目录:/home/wwwroot/www.wuball.com dotnet core 2.0 官方指引 sudo rpm --import https://packag ...

  4. dotnet core 3.0 linux 部署小贴士

    dotnet core 3.0 目前还是测试版,在linux下安装 sdk 需要有一些注意事项 1.下载url https://dotnet.microsoft.com/download/thank- ...

  5. dotnet cli 5.0 新特性——dotnet tool search

    dotnet cli 5.0 新特性--dotnet tool search Intro .NET 5.0 SDK 的发布,给 dotnet cli 引入了一个新的特性,dotnet tool sea ...

  6. .NET Conf 2019 大会上发布.NET Core 3.0

    北京时间今天凌晨如期在.NET Conf 上发布.NET Core 3.0,Keynotes 由Scott Hunter 主演,主要围绕.NET Core 3.0的新特性和社区展开. 多功能性是.Ne ...

  7. DotNet Core 2.0使用MySql实现Code First

    本教程使用vs2017 + dotnet core2.0 + MySql5.7.19 1.打开vs2017,文件>新建>项目,选择Asp.Net Core Web应用程序. 2.项目名称可 ...

  8. Visual Studio 2019 16.1 使用 .NET Core 3.0

    一.前言 早在很久之前微软便公布 .NET Core 3.0 将支持开发Winform应用程序等等新特性,现如今 .NET Core 3.0 预览版已经出来第五个预览版了,从 .NET Core 2. ...

  9. dotnet Core 2.0学习笔记(一)

    一:Dotnet Core Windows运行环境,标红部分要注意 https://docs.microsoft.com/en-us/dotnet/core/windows-prerequisites ...

  10. dotnet core 3.0 swagger 显示枚举描述

    上一篇net core 2.2 swagger的枚举描述,core 3.0 需要升级swagger到5.0rc版,配置需要做些修改,swaager启用了OpenApi标准,之前的枚举描述方法也失效了. ...

随机推荐

  1. openstack实战部署

    简介:Openstack系统是由几个关键服务组成,他们可以单独安装,这些服务根据你的云需求工作在一起,这些服务包括计算服务.认证服务.网络服务.镜像服务.块存储服务.对象存储服务.计量服务.编排服务和 ...

  2. 4_9.springboot2.x之使用外置servlet容器原理解析

    问题概述 嵌入式Servlet容器: 应用打成可执行的jar 优点:简单.便携: **缺点:**默认不支持JSP.优化定制比较复杂(使用定制器[ServerProperties.自定义WebServe ...

  3. 18-2-call和apply

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 18-1-函数中this的指向

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. java_瞬时

    瞬时(Instant): 方法: public class InstantTest01 { public static void main(String[] args){ //静态方法,返回utc上的 ...

  6. LuoguP3498 [POI2010]KOR-Beads

    呀呀呀,临走10分钟刷一道水题 然而只是记一下第一次hash被卡 各种模数都被卡了... 本来想打双哈希了,后来皮了一下,模数改成了998244353,然后竟然A掉了 正着hash一遍,反着hash一 ...

  7. Tomasulo algorithm

    https://en.wikipedia.org/wiki/Tomasulo_algorithm#Applications_and_legacy 1,  what is Tomasulo algori ...

  8. ThreadLocal简析

    简介 ThreadLocal在Java多线程开发中常见的一个类,在面试中也经见的问题,比如ThreadLocal的作用是什么,ThreadLocal的实现原理是什么等等.ThreadLocal是jav ...

  9. 第十三章 Odoo 12开发之创建网站前端功能

    Odoo 起初是一个后台系统,但很快就有了前端界面的需求.早期基于后台界面的门户界面不够灵活并且对移动端不友好.为解决这一问题,Odoo 引入了新的网站功能,为系统添加了 CMS(Content Ma ...

  10. Online开发初体验——Jeecg-Boot 在线配置图表

    Online开发——初体验(在线配置图表) 01 通过JSON数据,快速配置图形报表 02 通过SQL数据,快速配置图形报表 03 图表模板配置,实现不同数据源图表合并展示 04 图表布局,支持单排. ...