zoukankan      html  css  js  c++  java
  • .NET Framework 4 的一个兼容性问题

    测试程序

    我们来看看下面这个非常简单的 C# 程序 Tester.cs:

    复制代码
     1 using System;
     2 
     3 static class Tester
     4 {
     5   static void Main()
     6   {
     7     Console.WriteLine("   CLR: " + Environment.Version);
     8     Console.WriteLine("Concat: " + string.Concat(new int[]{12, 345}));
     9   }
    10 }
    复制代码

    这个测试程序的实质内容只有一行,就是第 8 行,调用了 string 类的静态方法 Concat。

    运行结果

    我们来看看上述测试程序的运行结果,首先是 Linux 操作系统的 Mono 环境:

    ben@vbox:~/work> gmcs Tester.cs && mono Tester.exe
       CLR: 2.0.50727.1433
    Concat: System.Int32[]
    ben@vbox:~/work> dmcs Tester.cs && mono Tester.exe
       CLR: 4.0.30319.1
    Concat: 12345
    

    还有 Windows 操作系统的 Microsoft .NET Framework 环境:

    D:\work> C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe Tester.cs
    Microsoft (R) Visual C# 2005 编译器 版本 8.00.50727.4016
    用于 Microsoft (R) Windows (R) 2005 Framework 版本 2.0.50727
    版权所有(C) Microsoft Corporation 2001-2005。保留所有权利。
    
    D:\work> Tester.exe
       CLR: 2.0.50727.4216
    Concat: System.Int32[]
    
    D:\work> C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe Tester.cs
    Microsoft(R) Visual C# 2010 编译器 4.0.30319.1 版
    版权所有(C) Microsoft Corporation。保留所有权利。
    
    D:\work> Tester.exe
       CLR: 4.0.30319.276
    Concat: 12345
    

    看出来了吧,同一个 C# 程序,不论是 Linux 操作系统还是 Windows 操作系统,在 .NET Framework 2.0 和 .NET Framework 4 之间都表现出了不兼容性。

    分析

    上述运行结果主要是由于 string 类的静态方法 Concat 在 .NET Framework 2.0 中有 9 种重载的版本,而在 .NET Framework 4 中有 11 种重载的版本。上述测试用的 C# 程序在实际调用的重载版本如下所示:

    .NET Framework 2.0: public static string Concat(Object arg0)
    .NET Framework 4  : public static string Concat<T>(IEnumerable<T> values)
    

    看来,往 .NET Framework Base Class Library 中增加新的方法也不是安全的,有可能改变原有的 C# 程序的行为。这提醒我们将原有的程序从 .NET Framework 2.0 往 .NET Framework 4 迁移时要多加小心,不光要注意到 MSDN 中明确指出“版本注意事项”的地方,也要注意这种微妙的改变。

    参考资料

    1. MSDN: String.Concat 方法 (System)
    2. MSDN: String.Concat 方法 (Object) (System)
    3. MSDN: String.Concat(T) 方法 (IEnumerable(T)) (System)
  • 相关阅读:
    再谈C#装箱和拆箱操作
    C#装箱与拆箱总结
    大话设计模式
    创建ASP.NET Webservice
    Lambada和linq查询数据库的比较
    设置VS2015背景图片(转载)
    windows 下使用Linux 子系统-安装.net core 环境
    .net core 3.1 ef Migrations 使用 CLI 数据迁移及同步
    linq 大数据 sql 查询及分页优化
    数据迁移最快方式,多线程并行执行 Sql插入
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2485005.html
Copyright © 2011-2022 走看看