Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将静态方法的修饰符从内部更改为公共是一个突破性的更改吗?_C# - Fatal编程技术网

C# 将静态方法的修饰符从内部更改为公共是一个突破性的更改吗?

C# 将静态方法的修饰符从内部更改为公共是一个突破性的更改吗?,c#,C#,如果我将公共类中静态方法的访问修饰符从internal更改为public,它会破坏调用该方法的外部程序集吗 注释:外部程序集可以使用InternalsVisibleTo属性调用内部方法: [程序集:内部可视(“外部类”)] 命名空间AssemblyWithInternalMethod 错误否?如果是内部调用,则还没有外部调用方。对他们来说,似乎添加了一个方法,这应该是一个非破坏性的更改。错误否?如果是内部调用,则还没有外部调用方。对他们来说,这看起来像是添加了一个方法,这应该是一个非破坏性的更改

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


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

[程序集:内部可视(“外部类”)]
命名空间AssemblyWithInternalMethod

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

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

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


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

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


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

不,它不会在从内部变为公共的过程中崩溃。如果反之亦然,则破译代码的概率更高。你可以通过C#查阅杰弗里·里克特(Jeffrey Richter)的著作《Clr》,书中清楚地提到了它。“将类设置为内部,除非我希望该类在程序集外部公开”,因此没有问题

不,在从内部更改为公共时,它不会中断。如果反之亦然,则破译代码的概率更高。你可以通过C#查阅杰弗里·里克特(Jeffrey Richter)的著作《Clr》,书中清楚地提到了它。“将类设置为内部,除非我希望将该类公开在我的程序集之外”,因此不可能出现问题

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

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();
        }
    }
}
这些都是编译的。但是,如果我将
SharedLibraryClass2.PotentialCollisionMethod
从内部更改为公共,我的依赖应用程序将不再编译

只需公开一个内部方法,我就可以在以前编译代码时得到以下错误:

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

这是可能的

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

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();
        }
    }
}
这些都是编译的。但是,如果我将
SharedLibraryClass2.PotentialCollisionMethod
从内部更改为公共,我的依赖应用程序将不再编译

只需公开一个内部方法,我就可以在以前编译代码时得到以下错误:

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



简短回答:不。为什么会这样,除非外部程序集对调用方法进行一些反射,等等?@DingxinXu从
internal
public
或反之亦然?相关:“-但这不适用于
静态
成员。外部程序集可以使用InternalsVisibleTo属性调用内部方法”。这与你的问题无关。撇开这应该被视为“请勿使用”功能这一事实不谈,
ExternalAssembly
已经有效地将任何内部静态方法视为公共方法。@DavidArno是的,我同意这应该被视为“请勿使用”,但实际上,我已经在生产代码中看到了它……简短回答:不,为什么,除非外部程序集对调用方法进行一些反射,等等?@DingxinXu从
内部
公共
或反之亦然?相关:“-但这不适用于
静态
成员。“外部程序集可以使用InternalsVisibleTo属性调用内部方法”。这与你的问题无关。撇开这应该被视为“请勿使用”功能的事实不谈,
ExternalAssembly
已经有效地将任何内部静态方法视为公共方法。@DavidArno是的,我同意这应该被视为“请勿使用”,但实际上,我已经在生产代码中看到了它……很好的捕获。对于那些不假思索地回答“否”的人来说,这是一个突破性的改变,但依赖于使用C#6.0功能。你能想到C#5.0的突破性变化吗?@WaiHaLee,你说“但依赖于使用C#6.0功能”,好像C#6.0在某种程度上是非标准的。这是C#6的最新版本。对于旧版本来说,这是否是一个突破性的改变有什么关系?我并不是说这是非标准的,或者你的答案对使用C#6.0是无效的;我比试图使你的答案无效更好奇。@DHN-不管
InternalsVisibleTo
属性如何,这个例子都失败了。捕捉得好。对于那些不假思索地回答“否”的人来说,这是一个突破性的改变,但依赖于使用C#6.0功能。你能想到C#5.0的突破性变化吗?@WaiHaLee,你说“但依赖于使用C#6.0功能”,好像C#6.0在某种程度上是非标准的。这是C#6的最新版本。对于旧版本来说,这是否是一个突破性的改变有什么关系?我并不是说这是非标准的,或者你的答案对使用C#6.0是无效的;我比试图使你的答案无效更好奇。@DHN-不管
InternalsVisibleTo
属性如何,这个例子都会失败。实际上,外部调用方可以调用内部调用,请参阅我的新更新。实际上,外部调用方可以调用内部调用,请参阅我的新更新。实际上,外部调用方可以调用内部调用