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