2

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

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我正在寻找一种尊重它的方法。

4

4 回答 4

5

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

在 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类型的字段,那么它不能const在 C# 中声明。然后你会这样做:

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

readonly意味着该字段只能从static同一类的(在这种情况下)构造函数更改(派生类的构造函数不行)。

于 2013-01-26T14:37:45.240 回答
4

Guid.NewGuid()每次调用都会返回一个新的 GUID,这就是你得到异常的原因。您可以替换 constreadonlystatic使用固定的 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 值都必须相同。

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

    // Fixed "forever" or until you manually change it
    // Cannot be changed in run-time
    public const String ExtensionKey = "3c88c196-06ec-4a89-bffa-6f3fd221f425";
于 2013-01-26T11:01:18.647 回答
3

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

public static readonly String ExtensionKey = Guid.NewGuid().ToString();
于 2013-01-26T10:58:10.770 回答
1

这个问题缺少一些细节;您希望您的 GUID 在每个类和进程中是唯一的,还是每个类都是唯一的,但每次启动程序时都相同?这是两个非常不同的事情。

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

我建议阅读这篇关于从字符串生成 GUID 的博客文章,实际代码位于GitHub 上

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

于 2013-01-26T11:18:50.563 回答