【问题标题】:Generate a Guid on compile time在编译时生成 Guid
【发布时间】:2013-01-26 10:55:09
【问题描述】:

我正在尝试生成一个我将使用的常量值,如下所示:

public class Foo()
{
    public const String ExtensionKey = Guid.NewGuid().ToString();
    public int ID { get; set; }
}

编译器抛出错误:

The expression being assigned to 'Foo.ExtensionKey' must be constant

我知道在编译时执行方法(构造函数或类型初始化程序)是不可能的。我正在寻找一种解决方法,将随机生成的 Guid 分配给不同类的不同 ExtensionKey 常量。

编辑:

目的是为每种类型生成一个唯一的 Guid。 Guid 值对于所有对象实例以及应用程序运行时都必须相同。这是Const 的行为,我正在寻找尊重它的方法。

【问题讨论】:

  • 在 Visual Studio 中,您可以选择“工具”-“创建 GUID”。或者在 Windows PowerShell 中,您可以说 [Guid]::NewGuid().ToString()。这会给你一个Guid。然后你可以使那个特定的Guidstring的字符串表示常量。
  • 你应该把它设置为答案
  • 我扩展了该评论并将其变成了答案。

标签: c# compiler-construction compiler-errors constants guid


【解决方案1】:

(这个答案的大部分“提升”了对问题的评论。)

在 Visual Studio 中,您可以选择“工具”-“创建 GUID”。或者在 Windows PowerShell 中,您可以说 [Guid]::NewGuid().ToString()。这会给你一个Guid。然后,您可以将该特定 Guid 的字符串表示形式设为您的 string 常量。

public const string ExtensionKey = "2f07b447-f1ba-418b-8065-5571567e63f6";

Guid 当然是固定的。标记为const 的字段始终为static(但您不能提供static 关键字;这是隐含的)。

如果你想拥有Guid类型的字段,那么在C#中不能声明const。然后你会这样做:

public static readonly Guid ExtensionKey = new Guid("2f07b447-f1ba-418b-8065-5571567e63f6");

readonly 表示该字段只能从同一类的构造函数(本例中为static)更改(派生类的构造函数不行)。

【讨论】:

    【解决方案2】:

    调用Guid.NewGuid() 每次都会返回一个新的 GUID,这就是你得到一个异常的原因。您可以将const 替换为readonlystatic,或者将固定的GUID 字符串替换为const

    public class Foo
    {
        // Fixed "forever" or until you manually change it
        // Cannot be changed in run-time
        public const String ExtensionKey = "3c88c196-06ec-4a89-bffa-6f3fd221f425";
    
        // You will get a new GUID per each Application Domain and per each run
        // Can be changed
        public static String ExtensionKey1 = Guid.NewGuid().ToString();
    
        // By convention this shall be private, as it's a field
        // You will get a new GUID per each instance of a class,
        // Once assigned, the value cannot be changed
        public readonly String ExtensionKey3 = Guid.NewGuid().ToString();
    
        // You will get a new GUID per each Application Domain and per each run,
        // Once assigned, the value cannot be changed
        public static readonly String ExtensionKey4 = Guid.NewGuid().ToString();
    }
    

    编辑

    目的是为每种类型生成一个唯一的 Guid。指导价值 所有对象实例必须相同,并且无论何时 应用程序运行。

    手动生成新的 GUID 并使用第一个选项

        // Fixed "forever" or until you manually change it
        // Cannot be changed in run-time
        public const String ExtensionKey = "3c88c196-06ec-4a89-bffa-6f3fd221f425";
    

    【讨论】:

      【解决方案3】:

      您可以通过将const 替换为static readonly 来获得几乎相同的行为

      public static readonly String ExtensionKey = Guid.NewGuid().ToString();
      

      【讨论】:

      • 这将为每个对象实例生成不同的 Guid。我需要一个在所有实例中唯一的 Guid
      • 如果将其更改为static,这将在每次运行应用程序时创建一个新的Guid
      【解决方案4】:

      这个问题缺少一些细节;您希望您的 GUID 每个类和进程是唯一的,还是每个类都是唯一的,但每次启动程序时都相同?这是两种截然不同的东西。

      如果您希望每个类和进程都有一个唯一的 GUID,那么您已经有了一些有效的答案,但是如果您想要每个类而不是每个进程的唯一 GUID,那么您需要一些其他方法来解决您的问题。要么在代码中输入 GUID,要么使用某种 GUID 生成器,它使用一些文本作为输入,而不是基于时钟或类似的随机数生成器。

      我建议阅读这篇关于从字符串生成 GUID 的 blog post,实际代码位于 GitHub

      通过使用类似的方法并使用类的全名作为输入,您将获得每个类的唯一 GUID,但对于每个进程仍然相同

      【讨论】:

        猜你喜欢
        • 2013-07-23
        • 2021-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-14
        • 2011-03-11
        • 1970-01-01
        相关资源
        最近更新 更多