首页 > 解决方案 > 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);
}

在这些更改之后,我的方法只能与正确的键一起使用,但我认为由于静态属性和隐式转换,它会降低性能。

所以我的问题是一个好主意吗?

我是不是多虑了?

与第一种方法相比,我的第二种方法会慢多少?

还有其他方法可以防止传递错误的论点吗?

标签: c#performanceconstants

解决方案


我是不是多虑了?

简短的回答,是的。

你要做的是防止传递一个无效的参数,这不是你首先应该做的,你应该考虑使用一个可能的枚举 IF,这使得它 99.9% 类型安全并且几乎没有检查将是必需的。

在您需要将该参数作为字符串的情况下,只需执行验证,GetValue(string key)如果您希望稍后处理,则返回 null 或仅抛出异常。


推荐阅读