当前位置:  开发笔记 > 编程语言 > 正文

静态类别 具有私有构造函数的类以及所有静态属性和方法?

如何解决《静态类别具有私有构造函数的类以及所有静态属性和方法?》经验,为你挑选了3个好方法。

当我创建实用程序类时,我通常会创建一个具有私有构造函数的类,并将其所有方法和属性公开为static.对此最好的方法是什么?我的方式或创建静态类有什么区别?



1> Alan..:

静态类是自动密封的,因此人们无法继承和覆盖它们的行为.

这是唯一真正的区别(除非IL中有特殊内容)

因此,如果您使用静态类,则可以省去将构造函数设为私有的麻烦,并声明类密封.

我想补充说,将类定义为静态是"自我记录"代码.您的库的用户将知道不应该实例化此类,并且只有静态值.


IL中确实存在一些特殊的东西.静态类被标记为抽象和密封(这不能通过C#完成),这绝对会阻止实例化.
请注意,根据Mehrdad([此处](http://stackoverflow.com/questions/5241899/what-is-the-difference-between-static-methods-in-a-non-static-class-and-static- me/5241927#5241927)),另一个区别是非静态类上的静态方法不能是扩展方法.

2> Corbin March..:

永远不能实例化静态类.没有办法,没有办法.

具有私有构造函数但非所有静态方法的非静态类可以以各种方式滥用 - 继承,反射,调用静态工厂中的私有构造函数 - 来实例化类.

如果你不想要实例化,我会选择静态类.


编辑 - 澄清FosterZ的评论

假设您有此实用程序类:

public class Utility
{
    public static string Config1 { get { return "Fourty Two"; } }

    public static int Negate(int x) { return -x; }

    private Utility() { }      
}

如果其他开发人员不清楚其意图,他们可以这样做:

public class Utility
{
    public static string Config1 { get { return "Fourty Two"; } }
    public int Config2 { get; set; }

    public static int Negate(int x) { return -x; }

    private Utility() { }

    /// Get an instance of Utility     
    public static Utility GetUtility()
    {
        return new Utility();
    }
}   

现在你有一个弗兰肯斯坦班.它的一些功能需要实例化,有些则不需要.也许这就是你想要的,但也许不是.您可以通过代码审查来防止这种情况,但为什么不在代码中明确表达您的意图?将类标记为static消除任何可能的混淆.您无法实例化静态类或从中继承.


@FosterZ - 我在答案中添加了一个例子.干杯.

3> 小智..:

除了之前的答案:编译器不允许静态类上的非静态成员产生和错误.这可能有助于一点点不会意外添加非静态成员.

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有