строковые константы c # против статических свойств - PullRequest
0 голосов
/ 08 июня 2018

У меня есть класс с предопределенными константными строками, которые используются в качестве ключей для извлечения данных из внешнего хранилища по предоставленному ключу.

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);
}

После этих изменений мой метод может использоваться только с правильными ключами, но я думаю, что это снизит производительность из-за статических свойств и неявного приведения.

Так что мой вопрос - это хорошая идея??

Я обеспокоен?

Насколько медленнее будет мой второй подход по сравнению с первым?

Есть ли другой способ предотвратить передачу неверных аргументов?

1 Ответ

0 голосов
/ 08 июня 2018

Я слишком обеспокоен?

Короткий ответ, да.

То, что вы пытаетесь сделать, - это предотвратить передачу неверного аргумента, который не является тем, что вы должнычтобы сделать это в первую очередь, вам следует рассмотреть возможность использования перечислимого IF, если это возможно, что делает его безопасным на 99,9%, и проверки почти не потребуются.

В ситуации, когда вам нужно, чтобы этот параметр был строкой, просто выполните проверку в GetValue(string key) и либо верните ноль, если вы хотите обработать это позже, либо просто сгенерируйте исключение.

...