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. 跨数据库查询——dblink

    现在本地建一个dblink Create database link create public database link DBLINKTEST (名称) connect to MGP(用户名) i ...

  2. 【转载】flex布局超过显示省略号

    <div class="main"> <div class="content"> <h4 class="name&quo ...

  3. HTML中使用js的三种方式及优缺点介绍

    1.内部js: 在直接在页面的<script></script>标签内写js代码 优点:相对于使用行内js,内部js代码较为集中,与页面结构的实现代码耦合度较低,比较便于维护 ...

  4. 一个上午,勉强记住了几种不同语言编译PE的启动函数

    VC:启动函数最乱,三大函数都在后面.前面8个PUSH DELPHI7:启动函数最整洁,2.3.4.2,形式排队 VB:启动函数最好记,12个0.... 汇编:三大函数距离最紧凑,除VB外,启动函数最 ...

  5. leetcode-106-从中序和后序遍历构造二叉树

    题目描述: 方法一:O(n) O(n) class Solution: def buildTree(self, inorder: List[int], postorder: List[int]) -& ...

  6. mybatis接口映射

    通过sqlSession.getMapper();方法获取映射的接口及方法 sqlSession调用Configuration的getMapper方法,方法中使用了mapperRegistry.get ...

  7. 修改文本框和文本域placeholder样式

    input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { font-size:20px; padding:20px ...

  8. 表单下拉框select

    <!DOCTYPE html> <html lang="zh"> <head> <title></title> < ...

  9. PAT甲级——A1099 Build A Binary Search Tree

    A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...

  10. 关于不同数据库的连接配置(MySql和Oracle)

    mysql: driverClass=com.mysql.jdbc.Driver #在和mysql传递数据的过程中,使用unicode编码格式,并且字符集设置为utf-8,插入数据库防止中文乱码 ur ...