c# - c# 字符串常量与静态属性
问题描述
我有一个带有预定义常量字符串的类,这些字符串用作键,通过提供的键从外部存储中检索数据。
public class StorageKeys
{
public const string SomeKey = "Foo";
public const string AnotherKey = "Foooo";
}
public interface IStorage
{
string GetValue(string key);
}
这是这样使用的:
IStorage t = new Storage();
string value = t.GetValue(StorageKeys.SomeKey);
它有效,但我担心有可能GetValue
仅使用字符串参数调用方法,这可能会导致错误:
string value = t.GetValue("Illegal key");
这就是为什么我提出了这个想法:
public class StorageKeys
{
public static StorageKeys SomeKey = new StorageKeys("Foo");
public static StorageKeys AnotherKey = new StorageKeys("Foooo");
private StorageKeys(string key)
{
_key = key;
}
private readonly string _key;
public static implicit operator string(StorageKeys key) => key._key;
}
public interface IStorage
{
string GetValue(StorageKeys key);
}
在这些更改之后,我的方法只能与正确的键一起使用,但我认为由于静态属性和隐式转换,它会降低性能。
所以我的问题是一个好主意吗?
我是不是多虑了?
与第一种方法相比,我的第二种方法会慢多少?
还有其他方法可以防止传递错误的论点吗?
解决方案
我是不是多虑了?
简短的回答,是的。
你要做的是防止传递一个无效的参数,这不是你首先应该做的,你应该考虑使用一个可能的枚举 IF,这使得它 99.9% 类型安全并且几乎没有检查将是必需的。
在您需要将该参数作为字符串的情况下,只需执行验证,GetValue(string key)
如果您希望稍后处理,则返回 null 或仅抛出异常。
推荐阅读
- wordpress - WordPress 自定义帖子类型链接已更改但返回 404
- c++ - graphics.h 没有输出
- python - 我正在尝试在 discord.py rewrite 中添加角色
- python - 将包含 timedelta64 对象列表的列保存为 Parquet 文件
- django - 如何在 Django UpdateView 中绑定表单?
- node.js - 如何修复 node.js 中的 Ecconrefused 错误?
- android - 如何在 android 中构建现有的 React-native ios 应用程序?
- git - 从 HEAD 签出文件的原因 ^ 将文件放在暂存区
- postgresql - 运行 psql 命令时出现 psql 的符号查找错误
- java - 如何使用来自 html 表单的 POST 的 Spring Security?