使用静态方法创建默认对象?

时间:2013-06-29 06:41:02

标签: c# xna xna-4.0

我正在构建一个用于我正在使用的XNA项目的骰子滚动程序,但我的问题纯粹是c#,更多的是关于最佳实践或我可能需要注意的任何问题。是否有效地使用对象定义中的静态方法来概述默认项的创建。

以下是我正在使用的代码的快照,

public struct Die{
    private DieType die;
    private static Random rnd = new Random();
    public static Die d2 = new Die(DieType.d2);
    public static Die d4 = new Die(DieType.d4);
    public static Die d6 = new Die(DieType.d6);
    public static Die d8 = new Die(DieType.d8);
    public static Die d10 = new Die(DieType.d10);
    public static Die d12 = new Die(DieType.d12);
    public static Die d20 = new Die(DieType.d20);
    public static Die d100 = new Die(DieType.d100);

    public Die(DieType die){
        this.die = die;
    }

    public int Roll(){
        return rnd.Next((int)die);
    }
}

当我引用Die结构时,使用这个代码似乎没有问题编译:

List <Roll> diceCup = new List<Roll>();
diceCup.Add (new Roll(4,Die.d6,-Die.d6.Roll()));

Roll是另一个结构,它需要一个Die of Die来滚动,还有一个短按来修改它。

对于我上面的示例,我创建了一个新的4d6-d6卷。

如果我要创建这些骰子的新实例,这是否会在以后出现问题?

感谢您的建议!

安德鲁

1 个答案:

答案 0 :(得分:0)

如果我想将它们用作方法组,我会向很多类添加一个静态工厂方法:

var people = names.Select(Person.Create);

在这种情况下,我只是用一组静态属性和懒惰单例替换不同工厂方法的集合:

public class Die
{
    private static Die _d2;

    public static Die D2
    {
        get
        {
            if(_d2 == null)
                _d2 = new Die(DyeType.D2);

            return _d2;
        }
    }

    private static Die _d3 ...

}

我使用这些而不仅仅是公共静态字段,因为我想将它们的创建延迟到第一次使用。

可以使用Lazy<T>简化:http://msdn.microsoft.com/en-us/library/dd642331.aspx

public class Die
{
    private static readonly Lazy<Die> _d2 = new Lazy<Die>(() => new Die(DyeType.D2));
    private static readonly Lazy<Die> _d3 = new Lazy<Die>(() => new Die(DyeType.D3));
    private static readonly Lazy<Die> _d4 = new Lazy<Die>(() => new Die(DyeType.D4));

    public static Die D2 { get { return _d2.Value; } }
    public static Die D3 { get { return _d3.Value; } }
    public static Die D4 { get { return _d4.Value; } }

    ...
}