C # имеет компьютерное значение константы константы - PullRequest
0 голосов
/ 01 марта 2012

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

У меня есть APIKey (который может меняться при разных сборках), и у нас есть другое поле, которое преобразует этот APIKey в более дружественный веб-интерфейс. Это дружественная сеть, на которой я хотел бы, чтобы компилятор вычислял.

В настоящее время мы пересчитываем значение при каждом вызове webapi. Я мог бы просто определить const и добавить его в веб-версию, но я хочу быть немного более изобретательным и предлагать меньше обслуживания.

я хочу что-то вроде этого.

public class WebSearch{
  private const string ApiKey="jsdfjsd90234092j3_%sss";
  private const string WebFriendlyKey=#Compiler(ApiKey.Replace("-","+"));
}

Где WebFriendlyKey вычисляется компилятором.

Ответы [ 2 ]

8 голосов
/ 01 марта 2012

В разделе 7.19 спецификации C # 4 перечислены все операции, которые компилятор будет выполнять над константами от вашего имени.Замена строки не является одним из них.

Однако вы можете использовать статическое поле только для чтения или статическое поле только для чтения со статическим свойством, которое вычисляет значение, если оно еще не вычислено, и извлекаетзначение, если оно есть.Компилятор не будет выполнять компиляцию в этом случае, но вычисления будут выполняться только один раз для домена приложения.

Тем не менее, я согласен с Хенком.У тебя есть рыба побольше.Беспокойство о том, что действительно влияет на правильность или производительность.

2 голосов
/ 01 марта 2012

Я не верю, что текущий компилятор C # может сделать это.Может быть, с выходом нового модульного компилятора (Roslyn).

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

public class WebSearch{
  private const string ApiKey="jsdfjsd90234092j3_%sss";

  // This guy will only run once per AppDomain
  private static readonly string WebFriendlyKey = ApiKey.Replace("-","+");
}
...