c#字符串常量与静态属性

c#字符串常量与静态属性,c#,performance,constants,C#,Performance,Constants,我有一个带有预定义常量字符串的类,这些字符串用作键,通过提供的键从外部存储器检索数据 public class StorageKeys { public const string SomeKey = "Foo"; public const string AnotherKey = "Foooo"; } public interface IStorage { string GetValue(string key); } 它是这样使用的: IStorage

我有一个带有预定义常量字符串的类,这些字符串用作键,通过提供的键从外部存储器检索数据

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);
}
在这些更改之后,我的方法只能与正确的键一起使用,但我认为它会因为静态属性和隐式转换而降低性能

那么我的问题是这是个好主意吗

我是不是太在意了


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

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

我是不是太在意了

简短的回答,是的

你想做的是防止传递一个无效的参数,这不是你应该首先做的,如果可能的话,你应该考虑使用EnUM,这使得它是99.9%类型的,几乎不需要检查。p>


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

那么,为什么您关心有人使用无效键调用该方法呢?这是他们要处理的问题。只要抛出一个例外。如果您非常关心正确的键,请包装接口并提供
GetFoo
getfooo
方法。“与第一种方法相比,我的第二种方法要慢多少?”为什么要问我们,而不是测量自己?不管怎样,我怀疑这是否会带来巨大的变化——如果有的话。只需选择适合你的解决方案,除非你对该解决方案有特殊问题。所以我猜这个问题是基于观点的。你可能已经在这个问题上浪费了比你的应用程序通过选择上面给出的选项节省的时间还要多的时间:)没有速度差异,JIT编译器使差异消失。然而,有一个很大的功能差异,public const声明是相当危险的。如果您提供的bug修复也会更改const值,那么您将遇到麻烦。这些更改不会影响使用这些值的任何其他程序集,常量值是在编译时烘焙的。公共常量只适用于“manifest常量”,该常量的值永远不会改变。NET Framework只有几个,Math.Pi就是其中之一。正如我在评论中指出的,使用枚举并不能使您免于执行验证检查。允许枚举接受基础类型的所有可能值,无论枚举是否有具有该值的命名成员。您说得有点对,但唯一的方法是故意将其转换为该类型,例如:
(StorageKeys)1
,因此,您关于使用一个将是“100%类型安全”且不需要检查的声明可能是,不完全正确?好了:)99.9%仍然意味着这不太可能发生,但您确实不需要显式强制转换来获得枚举值。可能存在反射代码,或者可能非常常见的JSON/XML反序列化,通常通过一些HTTP API实现。