Похожие страницы: Как я создаю статическую локальную переменную в Java?
Прощение, если это - дубликат; я был вполне уверен, это спросят ранее, и я смотрел, но не нашел простофилю.
Для меня действительно ли возможно создать статическую локальную переменную в C#? Если так, как?
У меня есть статический закрытый метод, который редко используется. статический метод использует Регулярное выражение, которое я хотел бы инициализировать однажды, и только при необходимости.
В C я мог сделать это с локальной статической переменной. Я могу сделать это в C#?
Когда я пытаюсь скомпилировать этот код:
private static string AppendCopyToFileName(string f) { static System.Text.RegularExpressions.Regex re = new System.Text.RegularExpressions.Regex("\\(copy (\\d+)\\)$"); }
... это дает мне ошибку:
ошибка CS0106: 'статичный' модификатор не допустим для этого объекта
Если нет никакой локальной статической переменной, я предполагаю, что мог бы приблизить то, что я хочу путем создания крошечного нового частного статического класса и вставки и метода и переменной (поле) в класс. Как это:
public class MyClass { ... private static class Helper { private static readonly System.Text.RegularExpressions.Regex re = new System.Text.RegularExpressions.Regex("\\(copy (\\d+)\\)$"); internal static string AppendCopyToFileName(string f) { // use re here... } } // example of using the helper private static void Foo() { if (File.Exists(name)) { // helper gets JIT'd first time through this code string newName = Helper.AppendCopyToFileName(name); } } ... }
Размышление об этом больше, использование класса помощника как это там привели бы к большим чистым сбережениям в эффективности, потому что класс Помощника не будет JIT'd или загруженный, если не необходимо.Правильно?
Нет, C # не поддерживает это. Вы можете приблизиться к этому с помощью:
private static System.Text.RegularExpressions.Regex re =
new System.Text.RegularExpressions.Regex("\\(copy (\\d+)\\)$");
private static string AppendCopyToFileName(string f)
{
}
Единственное отличие здесь - видимость 're'. Он предоставляется классу, а не только методу.
Переменная re
будет инициализирована в первый раз, когда содержащий класс каким-либо образом используется. Так что держите это в специализированном небольшом классе.
К сожалению, нет. Мне очень понравилась эта возможность в C.
У меня есть идея, что вы могли бы сделать.
Создайте класс, который будет предоставлять доступ к значениям, зависящим от экземпляра, которые будут сохраняться статически.
Примерно так:
class MyStaticInt
{
// Static storage
private static Dictionary <string, int> staticData =
new Dictionary <string, int> ();
private string InstanceId
{
get
{
StackTrace st = new StackTrace ();
StackFrame sf = st.GetFrame (2);
MethodBase mb = sf.GetMethod ();
return mb.DeclaringType.ToString () + "." + mb.Name;
}
}
public int StaticValue
{
get { return staticData[InstanceId]; }
set { staticData[InstanceId] = value; }
}
public MyStaticInt (int initializationValue)
{
if (!staticData.ContainsKey (InstanceId))
staticData.Add (InstanceId, initializationValue);
}
}
Можно так ...
class Program
{
static void Main (string[] args)
{
// Only one static variable is possible per Namespace.Class.Method scope
MyStaticInt localStaticInt = new MyStaticInt (0);
// Working with it
localStaticInt.StaticValue = 5;
int test = localStaticInt.StaticValue;
}
}
Это не идеальное решение, а интересная игрушка.
У вас может быть только одна статическая переменная этого типа для каждой области Namespace.Class.Method. Не будет работать в методах свойств - все они разрешаются в одно имя - get_InstanceId.
А как насчет этого, поскольку вы хотите, чтобы он инициализировался, только если он используется:
private static System.Text.RegularExpressions.Regex myReg = null;
public static void myMethod()
{
if (myReg == null)
myReg = new Regex("\\(copy (\\d+)\\)$");
}
Конечно. Вам просто нужно объявить частную статическую переменную вне метода.
private static readonly System.Text.RegularExpressions.Regex re = new System.Text.RegularExpressions.Regex( "\\(copy (\\d+)\\)$" );
private static string AppendCopyToFileName( string f )
{
//do stuff.
}
Фактически это именно то, что вы делаете, с той лишь разницей, что «re» имеет видимость для всего класса, а не только для метода.
Почему бы не создать в своем классе статический член только для чтения и, возможно, инициализировать его в статическом конструкторе?
Это даст вам такое же преимущество в производительности - он будет инициализирован только один раз.