我的一个项目有一个值类型/结构,表示视频格式的自定义标识符字符串.在这种情况下,它将包含一个内容类型字符串,但这可能会有所不同.
我已经使用了一个结构体,因此当它传递时它可以是强类型,并对初始字符串值执行一些健全性检查.
public struct VideoFormat {
private string contentType;
public VideoFormat(string contentType) {
this.contentType = contentType;
}
public string ContentType {
get { return this.contentType; }
}
public override string ToString() {
return this.contentType;
}
// various static methods for implicit conversion to/from strings, and comparisons
}
由于有一些非常常见的格式,我将这些格式暴露为具有默认值的静态只读字段.
public static readonly VideoFormat Unknown = new VideoFormat(string.Empty);
public static readonly VideoFormat JPEG = new VideoFormat("image/jpeg");
public static readonly VideoFormat H264 = new VideoFormat("video/h264");
将公共值公开为静态只读字段或仅获取属性是否更好?如果我想稍后更改它怎么办?我看到整个.Net框架中使用的两种方法,例如System.Drawing.Color使用静态只读属性,而System.String具有String.Empty的静态只读字段,System.Int32具有MinValue的const.
(大多数是从this question复制但具有更具体且不直接相关的问题.)
最佳答案 属性是一个好主意,除非你声明一些永远不会改变的东西.
使用属性,您可以更改内部实现,而不会影响使用库的程序并处理更改/变化.消费程序不会破坏,也不需要重新编译.
例如(我知道这是一个糟糕的例子,但你明白了……)
public static VideoFormat H264Format
{
get{
// This if statement can be added in the future without breaking other programs.
if(SupportsNewerFormat)
return VideoFormat.H265;
return VideoFormat.H264;
}
}
另请注意,如果您决定将某个字段更改为某个属性,则会消耗代码中断.