如何正确实现我自己的静态Empty或Zero字段

CS.*_*CS. 5 c# class-design

我有一个班,这个班可以是空的.此类只具有String类型的公共属性.当此类处于空状态时,这意味着所有属性都具有String.Empty的值.

1)使用公共静态字段,可以修改Class.Empty的属性.

2)我没有看到公共静态属性 getter 每次都应该返回一个新的空对象(手动将所有字段设置为Empty ).我认为这是不好的做法.

3)另一种解决方案是实现自己的类.IsNullOrEmpty(Class obj).

4)非静态公共布尔属性obj.IsEmpty.

在使用此类另一个类中,该属性永远不会为null.的其它类是从方法(的又一类,),其可以正确初始化它返回.

属性可能为null的唯一情况是,如果它在该方法之外被新建,则会导致它无论如何都处于无效状态.

Jon*_*eet 9

1和2冲突,基本上.

您的类型是不可变的,在这种情况下,您可以每次返回对同一实例的引用...或者它是可变的,在这种情况下,您必须每次返回对新对象的引用.

原因string.Empty很好正是因为string是不可改变的.

你的类型是否必须是可变的?

编辑:根据您的评论,听起来属性不应该有设置器.相反,值应该传递给构造函数,并存储在只读字段中.

此时,您的类型是不可变的,因此您可以公开公共字段或始终返回相同值的属性,即

private static readonly MyType empty = new MyType("", ""); // Or whatever
public static MyType Empty { get { return empty; } }
Run Code Online (Sandbox Code Playgroud)

要么

public static readonly MyType Empty = new MyType("", "");
Run Code Online (Sandbox Code Playgroud)

你不需要担心任何人设置任何属性,因为你没有任何setter ...

  • 这里的特殊问题是引用静态Empty的对象然后被序列化和反序列化现在引用静态的副本,因此引用比较将失败.这有时会咬人序列化DBNull并通过引用而不是类来测试它. (2认同)