У меня есть строка, вариант которой мне нужно использовать во многих местах моего приложения. Например:
String myString = "The Quick Brown Fox";
string someLowerCaseString = myString.ToLower();
string someUpperCaseString = myString.ToUpper();
string someOtherNewString = myString.Replace(' ','+');
У меня есть эта строка в файле Constants.cs
, на который я ссылаюсь во всем приложении. Я попробовал два разных подхода:
public const String myString = "The Quick Brown Fox";
public static readonly String myString = "The Quick Brown Fox";
Однако когда я пытаюсь «манипулировать» строкой для использования в инструкции switch
→ case
, я не могу заставить ее работать:
switch(some_value){
case Constants.myString.ToLower():
case Constants.myString.ToUpper():
case Constants.myString.Replace(' ','+'):
}
Я получаю ошибку:
CS0426: The type name 'myString' does not exist in the type 'Constants'
Я даже пробовал это:
String localString = Constants.myString.ToLower();
String localString = Constants.myString.ToUpper();
String localString = Constants.myString.Replace(' ','+');
const String localString = Constants.myString.ToLower();
const String localString = Constants.myString.ToUpper();
const String localString = Constants.myString.Replace(' ','+');
switch(some_value){
case localString:
}
И это тоже не работает. Я получаю ошибку:
CS9135: A constant value of type 'string' is expected
Я не могу использовать это:
switch(value.ToLower()){
// ...
}
Иногда мне нужно, чтобы первая буква была заглавной, а иногда мне нужны все буквы в верхнем/строчном регистре.
В официальной документации Microsoft C# говорится, что эти модифицирующие методы возвращают копию строки, поэтому я не думал, что на самом деле манипулирую константой String.
@ ipodtouch0218, поэтому я попробовал это: const var = Constants.myString.ToLower()
, которое копирует измененную строку в константу.
Я думаю, вы неправильно понимаете, как работает ключевое слово const
в C#. const
работает как замена: каждый раз, когда компилятор видит константную переменную, он заменяет ее литеральным значением. const
— это функция времени компиляции, вы не можете создать новую переменную const
во время выполнения. По этой же причине вы не можете делать такие вещи, как const string x = "abc".ToLower();
, потому что ToLower
— это функция времени выполнения. Каково было бы значение const, если бы вместо этого было const string x = "abc".ToUppercaseOnMondays()
?
Что вы на самом деле хотите с этим делать? Расскажите нам о проблеме, которая заставила вас придумать это сломанное решение.
Метки регистра должны быть константами, но вы можете использовать:
if (some_value.Equals(myString, StringComparison.CurrentCultureIgnoreCase) ||
some_value.Equals(myString.Replace(' ', '+'), StringComparison.CurrentCultureIgnoreCase)) {
// ...
}
Где StringComparison
также может быть StringComparison.OrdinalIgnoreCase
или StringComparison.InvariantCultureIgnoreCase
в зависимости от ваших потребностей.
Этот подход будет работать не только с строчными и прописными буквами, но и со смешанным регистром.
Вы можете заставить оператор переключения работать, если создадите константу myString
со всеми символами нижнего регистра, а также добавите вторую константу со знаками +
:
const String myString = "the quick brown fox";
const String myStringPlus = "the+quick+brown+fox";
switch (some_value.ToLower()) {
case myString:
case myStringPlus:
// ...
break;
// ...
}
Если вы не можете сделать их константами, вам придется вернуться к операторам if-else.
Попробуй это:
using System;
namespace CSharpTests
{
internal class Constants
{
public const String myString = "The Quick Brown Fox";
}
internal class Program
{
static void Main(string[] args)
{
String some_value = Constants.myString.ToLower();
switch (some_value)
{
case string s when s == Constants.myString.ToUpper():
Console.WriteLine("Is upper");
break;
case string s when s == Constants.myString.ToLower():
Console.WriteLine("Is lower");
break;
case string s when s == Constants.myString.Replace(' ', '_'):
Console.WriteLine("Is replaced");
break;
default:
Console.WriteLine("None of the cases");
break;
}
}
}
}
Операторы переключения ожидают постоянных значений, вы не можете
switch
использовать переменную. Даже если сама строка является константой, функции, которые вы вызываете впоследствии, могут не быть константами.ToLower
сам по себе даже не является константой, он может возвращать разные результаты в зависимости от локали.