我正在尝试生成一个我将使用的常量值,如下所示:
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
的行为,我正在寻找尊重它的方法。
答案 0 :(得分:4)
每次呼叫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值 对于所有对象实例和每当对象实例必须相同 申请运行。
手动生成新GUID并使用第一个选项
// Fixed "forever" or until you manually change it
// Cannot be changed in run-time
public const String ExtensionKey = "3c88c196-06ec-4a89-bffa-6f3fd221f425";
答案 1 :(得分:4)
(这个答案的大部分都是从评论中提升到“问题”。)
在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 :(得分:3)
将const
替换为static readonly
public static readonly String ExtensionKey = Guid.NewGuid().ToString();
答案 3 :(得分:0)