我正在构建一个用于我正在使用的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卷。
如果我要创建这些骰子的新实例,这是否会在以后出现问题?
感谢您的建议!
安德鲁
答案 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; } }
...
}