你能解释一下c#中internal关键字的实际用法吗?
我知道内部修饰符限制了对当前程序集的访问,但何时以及在何种情况下应该使用它?
你能解释一下c#中internal关键字的实际用法吗?
我知道内部修饰符限制了对当前程序集的访问,但何时以及在何种情况下应该使用它?
当前回答
在构建非托管代码的包装器时,internal关键字被大量使用。
当你有一个基于C/ c++的库,你想要DllImport,你可以导入这些函数作为一个类的静态函数,并使他们内部,所以你的用户只能访问你的包装器,而不是原始的API,所以它不能乱动任何东西。函数是静态的,您可以在程序集中的任何地方使用它们,用于您需要的多个包装器类。
你可以看看Mono。Cairo,它是使用这种方法的Cairo库的包装器。
其他回答
减少噪音,你暴露的类型越少,你的库就越简单。 防篡改/安全性是另一个问题(尽管Reflection可以战胜它)。
当您有方法、类等需要在当前程序集范围内访问,而不能在当前程序集范围外访问时。
例如,一个DAL可能有一个ORM,但对象不应该暴露给业务层,所有交互都应该通过静态方法完成,并传递所需的参数。
在构建非托管代码的包装器时,internal关键字被大量使用。
当你有一个基于C/ c++的库,你想要DllImport,你可以导入这些函数作为一个类的静态函数,并使他们内部,所以你的用户只能访问你的包装器,而不是原始的API,所以它不能乱动任何东西。函数是静态的,您可以在程序集中的任何地方使用它们,用于您需要的多个包装器类。
你可以看看Mono。Cairo,它是使用这种方法的Cairo库的包装器。
前几天,也许是一个星期,在一个我不记得的博客上看到了一个有趣的东西。基本上这不是我的功劳,但我认为它可能有一些有用的应用。
假设您想让另一个程序集看到一个抽象类,但不希望有人能够继承它。Sealed不能工作,因为它是抽象的,这个程序集中的其他类确实从它继承。Private将不起作用,因为您可能希望在另一个程序集中声明一个Parent类。
namespace Base.Assembly { public abstract class Parent { internal abstract void SomeMethod(); } //This works just fine since it's in the same assembly. public class ChildWithin : Parent { internal override void SomeMethod() { } } } namespace Another.Assembly { //Kaboom, because you can't override an internal method public class ChildOutside : Parent { } public class Test { //Just fine private Parent _parent; public Test() { //Still fine _parent = new ChildWithin(); } } }
如您所见,它有效地允许某人使用父类而不能够继承。
使用internal的另一个原因是混淆了二进制文件。混淆器知道打乱任何内部类的类名是安全的,而公共类的名称不能打乱,因为这可能破坏现有的引用。