静态构造函数、内部构造函数和公共构造函数有啥区别?
Posted
技术标签:
【中文标题】静态构造函数、内部构造函数和公共构造函数有啥区别?【英文标题】:What is the difference between static, internal and public constructors?静态构造函数、内部构造函数和公共构造函数有什么区别? 【发布时间】:2011-10-23 20:04:31 【问题描述】:静态构造函数、内部构造函数和公共构造函数有什么区别?为什么我们需要一起创建所有这些?
static xyz()
public xyz()
internal xyz()
【问题讨论】:
你不需要全部创建。 为什么投反对票?所以他什么都不知道,大莳萝,这不像是他问了一个愚蠢的问题。 虽然没有投反对票,但投反对票的原因之一很明显是“这个问题没有显示任何研究工作”。 对不起,我不再重复了。 我知道这晚了,但 *** 正在成为研究的起点。我的公司有一个允许访问堆栈溢出的代理,Google 上的大多数链接都被阻止了。 【参考方案1】: 静态构造函数只运行 - 在第一次使用类之前,它只能访问类的静态成员 每次使用new
创建类的对象时,都会运行公共构造函数
Internal 只是上面构造函数的另一个访问修饰符。它也可以是私有的。这与其他函数的访问修饰符完全相同。
您的代码实际上并没有编译,因为内部代码和公共代码是具有不同修饰符的相同构造函数,您无法做到这一点。您需要选择内部或公共(或私有)。
【讨论】:
公共构造函数不会在您每次创建对象时运行。因为可以使用另一个公共构造函数或具有另一个访问修饰符的构造函数来创建对象。也可以创建没有new
的对象。当您将值类型装箱时,您会创建一个对象但不使用 new【参考方案2】:
static
构造函数将在第一次实例化该类型的对象或调用静态方法时调用。并且只会运行一次
public
构造函数可供所有其他类型访问
internal
构造函数只能被同一程序集中的类型访问
在这三个之上还有protected
,它只能被从封闭类型派生的类型访问
和protected internal
,只有同一程序集中的类型或从封闭类型派生的类型才能访问
和 private
只能从类型本身和任何嵌套类型访问
【讨论】:
受保护的内部,只能由同一程序集中的类型或从封闭类型(其他程序集)派生的类型访问,而不是“派生......”。【参考方案3】:public
和internal
的区别在于internal
构造函数只能在同一个程序集中调用,而public
也可以从其他程序集中调用。
static
是一个构造函数,仅在第一次引用该类时才被调用。静态成员不属于类的实例,而是“属于类本身”。有关static
的更多信息,请参阅http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx。
【讨论】:
【参考方案4】:静态构造函数在第一次使用 type 时被调用。在静态上下文中或通过创建实例。
在创建新实例 时会调用所有其他构造函数。修饰符只是决定哪些代码可以创建实例。
如果您的构造函数是私有的,则只有类本身和嵌套类型可以创建实例(可能在静态工厂方法中)。这类似于公共/私有/内部方法。
【讨论】:
私有也暴露于嵌套类型 有没有办法强制“使用”泛型类型 T 而无需构造实例? 我不明白你的问题。您可以使用通用参数声明静态方法:public static T Get<T>()
。这样,您必须在调用方法时指定泛型参数。如果您的班级有一个通用参数,您必须在班级上指定它。喜欢SomeClass<T>.Do()
。
@Zebi: 如果有多种类被设计为由Factory.Get<T>
返回,并且每个类的静态构造函数都向Factory
注册,那么Factory.Get<T>
将能够对其静态构造函数已运行的任何此类T
进行操作。但是,除了反射之外,我不知道任何其他方式,如果Foo
缺少公共默认构造函数并且没有运行其公共构造函数,则Factory.Get<Foo>
可以通过反射工作。请注意,仅将Foo
作为通用参数传递,甚至创建Foo[]
是不够的。【参考方案5】:
您不需要创建所有类型的构造函数。访问修饰符与任何其他访问修饰符具有相同的功能 - 确定如何访问构造函数。
静态构造函数将在第一次静态访问类时被调用。 具有 internal 访问修饰符的构造函数只能由满足internal
条件的项目调用,即“只能在同一程序集中的文件中访问”。
任何东西都可以访问带有 public 访问修饰符的构造函数
等等。 protected
和 private
构造函数按预期运行 - 满足访问修饰符条件的项可以访问构造函数。
【讨论】:
以上是关于静态构造函数、内部构造函数和公共构造函数有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章