我正在尝试生成一个常量值,我将使用如下所示的值:
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
。然后,您可以将该特定 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
)构造函数更改(派生类的构造函数不行)。
调用
Guid.NewGuid()
每次都会返回一个新的 GUID,这就是为什么你会遇到异常。您可以将 const
替换为 readonly
或 static
,或者使用固定 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";
将
const
替换为 static readonly
可以获得几乎相同的行为
public static readonly String ExtensionKey = Guid.NewGuid().ToString();
这个问题缺乏一点细节;您是否希望 GUID 每个类和进程都是唯一的,或者每个类都是唯一的,但每次启动程序时都相同?这是两个截然不同的事情。
如果您想要每个类和进程有一个唯一的 GUID,那么您已经有了一些有效的答案,但是如果您想要每个类而不是每个进程有一个唯一的 GUID,那么您需要一些其他方法来解决您的问题。要么在代码中输入 GUID,要么使用某种 GUID 生成器,该生成器使用某些文本作为输入,而不是基于时钟或类似的随机数生成器。
我建议阅读这篇关于从字符串生成 GUID 的博客文章,实际代码位于 GitHub。
通过使用类似的东西并使用类的全名作为输入,您将获得每个类的唯一 GUID,但每个进程仍然相同