【问题标题】:Is changing the modifier of a static method from internal to public a breaking change?将静态方法的修饰符从内部更改为公共是否是一项重大更改?
【发布时间】:2016-01-21 11:04:07
【问题描述】:

如果我将公共类中的静态方法的访问修饰符从内部更改为公共,它会破坏调用该方法的外部程序集吗?

注意:内部方法可以被外部程序集调用,使用 InternalsVisibleTo 属性:

[assembly: InternalsVisibleTo("TheExternalAssembly")]    
namespace TheAssemblyWithInternalMethod 

【问题讨论】:

  • 简短回答:不。为什么会这样,除非外部程序集对调用方法等进行一些反射?
  • @DingxinXu 从internalpublic 或者反之亦然?
  • 相关:“Is it a breaking change that modifying the access modifier of a public property?” - 但这不适用于static 成员。
  • " 外部程序集可以使用 InternalsVisibleTo 属性调用内部方法"。这与您的问题无关。撇开这应该被视为“不使用”功能这一事实不谈,TheExternalAssembly 已经有效地将任何内部静态方法视为公共的。
  • @DavidArno 是的,我同意这应该被视为“不使用”,但实际上,我已经在生产代码中看到了它......

标签: c#


【解决方案1】:

有可能。

想象一下这个共享库代码:

namespace SharedLibrary
{

    public class SharedLibraryClassOne
    {
        public static void PotentialCollisionMethod()
        {
        }

        internal static void SharedLibraryMethodTwo()
        {
        }
    }

    public class SharedLibraryClassTwo
    {
        internal static void PotentialCollisionMethod() 
        {
        }

        public static void SharedLibraryMethodThree()
        {
        }
    }
}

这是一个链接到库的控制台应用程序:

using static SharedLibrary.SharedLibraryClassOne;
using static SharedLibrary.SharedLibraryClassTwo;

namespace StackOverflowChallenge20160121
{
    class Program
    {
        static void Main(string[] args)
        {
            PotentialCollisionMethod(); // Invokes SharedLibraryClassOne.PotentialCollisionMethod
            SharedLibraryMethodThree();
        }
    }
}

这一切都会编译。但是,如果我将 SharedLibraryClassTwo.PotentialCollisionMethod 从 internal 更改为 public,我的依赖应用程序将不再编译。

仅仅通过公开一个内部方法,我在之前的编译代码中得到以下错误:

错误 CS0121:以下方法之间的调用不明确或 属性:“SharedLibraryClassOne.PotentialCollisionMethod()”和 'SharedLibraryClassTwo.PotentialCollisionMethod()'

【讨论】:

  • 不错的收获。谁不假思索地回答了No
  • 诚然,这是一个重大更改,但依赖于使用 C# 6.0 功能。你能想到 C# 5.0 的重大变化吗?
  • @WaiHaLee,您说“但依赖于使用 C# 6.0 功能”,就好像 C# 6.0 在某种程度上是非标准的。它是 C# 6 的当前版本。对于旧版本来说,它是否是重大更改有什么相关性?
  • 我并不是说它是非标准的,或者您的答案对于使用 C# 6.0 是无效的;我比试图使你的答案无效更好奇。
  • @DHN - 无论InternalsVisibleTo 属性如何,此示例都会失败。
【解决方案2】:

错误... ?如果它是内部的,则还没有外部调用者。对他们来说,这看起来像是添加了一个方法,这应该是一个非破坏性的更改。

【讨论】:

  • 其实内部可以被外部调用者调用,看我的新更新。
【解决方案3】:

嗯,正如internal 已经说过的那样。无法从其他程序集访问该方法。一些额外的info

所以不,它不会破坏任何东西。它将提供新的机会。

【讨论】:

  • 其实内部可以被外部调用者调用,看我的新更新
  • @DingxinXu 呃,如果你问我,你应该重新设计。如果有必要使用这种令人毛骨悚然的方法……那么它就坏了,不会持续太久。
【解决方案4】:

不,从内部更改为公共时它不会中断。如果反之亦然,则破解代码的可能性更高。您可以通过 C# 参考 Jeffrey Richter 的书 Clr,其中明确提到了它。 “除非我希望课程在我的程序集之外公开公开,否则将课程设为内部”,因此没问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 2019-06-05
    相关资源
    最近更新 更多