【发布时间】:2016-06-21 22:14:31
【问题描述】:
我正在使用第三方控件,它使用“奇怪的值”来区分选项列表。他们使用两个不同的属性来唯一标识每个选择。
Example:
"Field" + "RW" = "CheckedOutBy"
"System" + "N" = "Name"
"Field + "N" = "Notifier"
总共有 37 个不同的选项(每个选项都有两个值的不同组合,构成 37 个唯一选项)。
我创建了一个存储两个值的结构,我的想法是为每个选择创建一个新的结构实例。
public struct ColumnCode : IEquatable<ColumnCode>
{
public static readonly ColumnCode Empty = new ColumnCode();
private readonly ColumnType _columnType;
private readonly string _code;
internal ColumnCode(ColumnType columnType, string code)
{
_columnType = columnType;
_code = code;
}
public override string ToString() { ... }
public bool Equals(ColumnCode other) { ... }
public override int GetHashCode() { ... }
}
理想情况下,我想为每个选择创建一个“常量”,但由于常量不是一个选项,我想尝试模仿一个常量。
我想出的两种方法是使用静态只读字段或仅使用 getter 的静态属性。
public static class FieldOption
{
public static ColumnCode CheckedOutBy { get; } = new ColumnCode(ColumnType.Field, "XW");
public static ColumnCode Name { get; } = new ColumnCode(ColumnType.System, "N");
public static ColumnCode Notifier { get; } = new ColumnCode(ColumnType.Field, "N");
}
或
public static class FieldOption
{
public static readonly ColumnCode CheckedOutBy = new ColumnCode(ColumnType.Field, "XW");
public static readonly ColumnCode Name= new ColumnCode(ColumnType.System, "N");
public static readonly ColumnCode Notifier = new ColumnCode(ColumnType.Field, "N");
}
无论哪种情况,我现在都可以使用FieldOption.CheckedOutBy、FieldOption.Name 或FieldOption.Notifier 等来引用我的C# 代码中的选项,但我不确定一种方法是否比另一种更好。
这些选择中的一个是否比另一个更适合模仿 const,或者是否有更好的方法我没有考虑。
我在互联网上阅读了大量信息,但仍然没有找到一个好的答案。其中一些似乎是矛盾的。许多信息表明属性优于字段,但在这篇文章 (https://msdn.microsoft.com/en-us/library/ms229057(v=vs.110).aspx) 中,微软说“对预定义的对象实例使用公共静态只读字段”所以我觉得静态只读字段是正确的选择。
我也不确定反射是如何在这里发挥作用的。我想确保 FieldOptions 的值不能更改,即使通过反射也是如此。
对此的任何帮助将不胜感激。
【问题讨论】:
-
你知道关键字的作用吗?
-
@Jeroen Vannevel 不确定我是否理解您的问题?我只是想知道 C# 编译器是否以不同的方式处理这些?是否有性能优势等
-
一个是静态的,另一个不是。一个是属性,另一个是字段。显然这些会有差异 - 由您决定您对哪种差异感兴趣。如果您的意思是所有差异,那么最好的做法是阅读文档并查看效果是
static以及字段和属性的不同之处。在您提出更具体的问题后,我们可以改为回答 -
到目前为止,帖子中没有任何迹象表明问题比我作为重复链接的常规“公共字段与属性”主题更具体......我相信你之前已经仔细阅读过提出问题,但未反映在帖子中 - 如果您认为需要重新打开帖子,请确保编辑您的帖子。
-
@Phaeze 性能问题应该包含测量、性能目标和关于作者希望看到什么解释/改进的具体问题。这也是对展示研究的常规要求的补充(尤其是在诸如“财产访问是否被内联”之类的问题上讨论到死)......所以我怀疑 OP 是否真的在问这个问题(因为帖子中没有显示任何必需的信息)
标签: c#