【问题标题】:How to declare a constant Guid in C#?如何在 C# 中声明常量 Guid?
【发布时间】:2011-06-23 00:45:30
【问题描述】:

是否可以在 C# 中声明常量 Guid?

我知道我可以声明static readonly Guid,但是有没有一种语法可以让我写const Guid

【问题讨论】:

  • 静态只读 Guid 有什么问题?
  • 没什么,如果这是唯一的方法。
  • @Pedro,一个 const 在编译时评估,一个静态在运行时评估。
  • 正如一些答案指出的那样,目前没有办法制作 Guid const。 ProVega 对我使用 const 字符串的回答可能是最佳答案。我不喜欢他的属性用法,但我会根据字符串创建一个静态只读 Guid。主要优点是您可以正常使用 Guid,但一个例外是 switch 语句。那时您可以使用 const 字符串成员。 switch 语句是我遇到的唯一一种静态只读不起作用的情况。

标签: c# constants guid compile-time-constant


【解决方案1】:

没有。 const 修饰符仅适用于“原始”类型(bool、int、float、double、long、decimal、short、byte)和字符串。基本上任何你可以声明为文字的东西。

【讨论】:

  • 实际上是反过来定义的。您可以将const 用于任何编译时文字值。 C# 实际上并没有定义术语“原始类型”;这在技术上只是俚语。其他语言实际上使用定义术语“原始类型”并具有此类类型的固定列表。事实上,Guid 有一个编译时文字,即default(Guid)。这是 Guid 的唯一编译时文字。
【解决方案2】:

虽然您似乎无法这样做,但您可以在需要时对其进行解析:

const string _myGuidStr = "e6b86ea3-6479-48a2-b8d4-54bd6cbbdbc5";

但是不要使用上面的 guid,因为它完全属于我,我首先生成了它,所以我声明了上面这个特定 guid 的所有权!但我很慷慨——改用这个(我不喜欢它对我说话的方式,但当它闭嘴时,它总体上是一个很好的向导):284c694d-d9cc-446b-9701-b391876c8394

【讨论】:

  • @ZarShardan 他们是独一无二的!
【解决方案3】:

声明为static readonly Guid而不是const Guid

【讨论】:

  • 我相信这是最好的答案,因为它是唯一一个在不改变最终结果的情况下提供替代方案的方法,静态只读可以以与 const 相同的方式使用,包括智能感知
  • @Raffaeu:这是一个非常有用的帖子(来自我的 +1),但从技术上讲,它甚至没有回答问题(“是否可以在 C# 中声明一个常量 Guid?”),也没有它对为什么给出了任何解释吗?答案是肯定的或否定的。它提供了一种解决方法,但没有解释static readonlyconst 的不同之处,以及使用其中一个而不是另一个的含义。因此,它远非“最佳答案”应有的样子。
【解决方案4】:

我是这样做的:

public static class RecordTypeIds
{
    public const string USERS_TYPEID = "5C60F693-BEF5-E011-A485-80EE7300C695";
    public static Guid Users { get { return new Guid(EntityTypeIds.USERS_TYPEID); } }
}

【讨论】:

  • 使用只读字段而不是为每次访问创建新 Guid 的属性,您将获得稍微更好的性能
  • 我最喜欢你的答案减去 get 属性。我同意 smartcaveman 的观点......只需将其设为公共静态只读 Guid。
  • 哦,我最喜欢这个的唯一原因是它允许在 switch 语句中使用字符串。我使用静态只读 Guid 的所有其他地方。
【解决方案5】:
public static readonly Guid Users = new Guid("5C60F693-BEF5-E011-A485-80EE7300C695");

就是这样。

【讨论】:

  • 然而这是一个合适的选择。
  • 如果您需要在编译时评估的东西,这不是一个合适的选择。
  • 这个不是常量的用例是 START CODE public static readonly Guid defaultGuid = new Guid("5C60F693-BEF5-E011-A485-80EE7300C695"); protected bool (Guid userID = defaultGuid); {返回假; } END CODE 不会编译。因为 guid 不是编译时间常数
  • 正是我想要的! :)
猜你喜欢
  • 2015-09-18
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2013-08-03
相关资源
最近更新 更多