У меня есть локальная строка (путь к файлу), которую мне нужно получить из функции только один раз, и я хотел бы убедиться, что она больше никогда не будет изменяться. Я не могу использовать ключевое слово const
, потому что значение моей строки определяется во время выполнения, а не во время компиляции. Поэтому я попытался использовать вместо этого ключевое слово readonly
, но Visual Studio сообщает мне, что оно недопустимо для моего элемента. Как мне достичь желаемого уровня защиты, желательно без создания другого класса?
Для простоты и политики компании я (резко) сжал и переименовал свои классы и функции, но концепция осталась прежней.
public class myClass
{
private void myFunction()
{
readonly string filePath = HelperClass.getFilePath("123");
//do stuff
}
}
public static class HelperClass
{
public static string getFilePath(string ID)
{
switch(ID)
{
case "123":
return "C:/123.txt";
case "234":
return "C:/234.txt";
default:
throw new Exception(ID + " is not supported");
}
}
}
=== Редактировать для PS2Goat ====
public class myClass
{
protected SomeObject o;
private virtual readonly string path;
public myClass(someObject o)
{
this.o = o;
path = HelperClass.getFilePath(o.getID());
}
private virtual void myFunction()
{
//do stuff
}
}
public class myDerivedClass
{
private override virtual readonly string path;
public myDerivedClass(someObject o) : base(o)
{
path = HelperClass.getFilePath(o.getID()); //ID will be different
}
private override void myFunction()
{
//do different stuff
}
}
public static class HelperClass
{
public static string getFilePath(string ID)
{
switch(ID)
{
case "123":
return "C:/123.txt";
case "234":
return "C:/234.txt";
default:
throw new Exception(ID + " is not supported");
}
}
}
Видите ли, эта проблема, с которой я столкнулся, заключается в том, что если я хочу вызвать исключение, мне придется перехватить его в конструкторе родительского класса на данный момент (пока этот класс не будет поддерживаться), потому что родительский конструктор будет вызываться до производный конструктор. Таким образом, неправильный идентификатор будет установлен один раз перед вызовом дочернего конструктора (с правильным идентификатором).
filePath
, ее значение не изменится. - person Yurii   schedule 30.07.2014readonly
и его инициализации только один раз в конструкторе (или конструкторе типа), но только если методgetFilePath
не требует значительного времени - person Fedor   schedule 30.07.2014