如果我声明一个内部类,内部成员的默认访问级别是啥?
Posted
技术标签:
【中文标题】如果我声明一个内部类,内部成员的默认访问级别是啥?【英文标题】:If I declare an internal class, what the default access level of internal members be?如果我声明一个内部类,内部成员的默认访问级别是什么? 【发布时间】:2014-10-02 17:32:59 【问题描述】:我正在构建一个具有一些基本功能的 DLL。长话短说,我正在制作一些静态类供开发人员使用。这些类使用了一些其他的类来做脏活,我将它们标记为内部的,因为我不希望人们访问它们。
问题是:如果我将一个类声明为内部类,他的成员的访问级别是多少?
我必须将其所有成员标记为内部,否则它们也会自动标记为内部?
这是一个很好的 2 小时,我在 *** 中搜索和搜索,我正在努力寻找一个明确而直接的答案,其中不包括 1000 个猜测、技术上不太可能的假设和无用的装饰......
MSDN 像往常一样令人困惑(从未在 msdn 上找到明确的答案)。
从我在这里看到的http://msdn.microsoft.com/en-us/library/ms173121.aspx 我猜无论你如何设置类访问级别,他的所有成员都将是私有的(方法、变量等)。
帮忙,我不知道
【问题讨论】:
您理解正确:默认情况下它们是私有的。虽然我不明白为什么要大惊小怪,为什么要花两个小时 - 你可以启动 Visual Studio 并在 2 分钟内对其进行测试。 @FarhadJabiyev:-where as members of a struct are public by default.
不,那不是真的,它们默认是私有的
只是我的两分钱:如果您只是想让您的 lib 更具可读性,请减少静态类的使用,并且仅通过实现抽象工厂/单例来提供接口实现。为什么要为语言特定的东西烦恼,比如内部修饰符。
@ovm 我会的,如果我知道这甚至意味着什么。 TheodorosChatzigiannakis 当我大部分时间在 Visual Studio 中测试东西时,我担心意外的结果或不准确的测试,所以我更喜欢圣经参考或专业人士的回答,更不用说测试这将需要构建 2 个单独的项目并尝试将其中的一个链接起来另一个。太麻烦了,google一下比较快。我的恐惧来了,你告诉我一件事,其他人说相反……为什么会发生这种情况??? :(
【参考方案1】:
仅来自MSDN
类成员和结构成员的访问级别,包括 嵌套的类和结构,默认是私有的。
接口默认为内部访问。
希望这张表有所帮助:
Members of Default member accessibility
---------- ----------------------------
enum public
class private
interface public
struct private
也可以查看MSDN
【讨论】:
【参考方案2】:问题是:如果我将一个类声明为内部类,那么访问权限是什么? 他的会员等级会是?
默认为私有。如果还有别的,那就要看情况了。如果它们不是公共的,则访问修饰符将按照 MSDN 中的说明应用(例如,在程序集之外不可见)。
但是,在您发布的链接中,有一个适用于非静态类的问题:
通常,成员的可访问性不大于 包含它的类型的可访问性。然而,一个公共成员 如果可以从程序集外部访问内部类的 该成员实现接口方法或覆盖虚拟方法 在公共基类中定义。
关于上一段,既然静态类不能实现接口,也不能继承其他类,那你就放心了。只要您将静态类声明为内部的,成员就不会在其他程序集中可用(除非您的开发人员使用反射)。
举例说明它如何对非静态类起作用:
组装 1
public interface ISomePublicInterface
int GetValue();
internal class InternalClass : ISomePublicInterface
public int GetValue()
return 100;
public static class SomeFactory
public static ISomePublicInterface GetInternalInstanceAsInterface()
return new InternalClass();
组装 2
ISomePublicInterface val = SomeFactory.GetInternalInstanceAsInterface();
Console.WriteLine(val.GetValue()); //-->> Calls public method in internal class
Console.WriteLine(val.GetType());
猜猜输出是什么?
Assembly1.InternalClass
所以,现在您可以访问程序集之外的类型,并且可以通过反射调用其他内部方法(这不是获取它的唯一方法)。
【讨论】:
【参考方案3】:除非另有说明,否则为私有。但是,public 会得到与 internal 相同的结果。
如果您稍后将一个类从内部提升为公共,那么创建公共类对象将变得可见,而内部作用域的方法将保持在内部。
如果您的类范围更新,您可能需要考虑行为。
Another stack overflow question.
【讨论】:
【参考方案4】:内部类的所有成员都是内部的,可以在同一个程序集中访问,既不在类也不在成员之外。
如果您想访问其他程序集中的类,请将类设为公共,而您不想在程序集外部访问的成员将它们设为内部。
【讨论】:
【参考方案5】:如果你将任何类声明为“内部”,那么这意味着你可以在同一个程序集中访问这个类。但是你对类成员使用什么样的访问说明符决定它们是可访问的,它们不在同一个程序集中的不同类中。
【讨论】:
以上是关于如果我声明一个内部类,内部成员的默认访问级别是啥?的主要内容,如果未能解决你的问题,请参考以下文章