gpt4 book ai didi

c# - 检查字符串是否是编译时已知的文字字符串?

转载 作者:太空狗 更新时间:2023-10-29 21:27:16 25 4
gpt4 key购买 nike

我正在写一个库,我有一个接受字典的方法。字典的值是不可信/不安全的,但 key 是可信的,如果最终用户能够输入任意 key 名称,那么“坏事”可能会发生。

所以当其他开发人员使用这个库函数时,我想强制他们在编译时知道键名。所以这样的事情是允许的:

string userInput = Console.ReadLine(); 
Dictionary<string, string> something = new Dictionary<string, string>();
something.Add("MyKey", userInput);

因为“MyKey”是一个字符串文字,在编译时已知。但是像这样的事情会引发编译或运行时异常:

string userInput = Console.ReadLine();
string userKey = Console.ReadLine();
Dictionary<string, string> something = new Dictionary<string, string>();
something.Add(userKey, userInput);

因为用户输入用于 key (userKey),因此在编译时它是未知的。

我查看了 GetType() 并没有真正区分文字字符串和运行时创建的字符串。

最佳答案

您可以使用 string.IsInterned 来确定字符串是否被驻留。默认情况下,所有编译时文字都将被保留,但您可以使用编译器标志将其关闭。

这是运行时检查,不是编译时检查。

另请注意,非编译时文字可以使用 string.Intern 函数进行驻留,因此技术上您可以让非文字字符串通过测试。但是,如果您的程序在任何时候都没有驻留字符串,或者只驻留您知道安全的字符串,那么这可能会起作用。


如果您的所有键都应该在编译时已知,另一种选择是根本不要让键成为字符串。例如,将键设为枚举,这样您就知道唯一可以用作键的值位于您在编译时固定的列表中。

关于c# - 检查字符串是否是编译时已知的文字字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31035933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com