C# поддерживает использование статических локальных переменных?

Похожие страницы: Как я создаю статическую локальную переменную в 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 или загруженный, если не необходимо.Правильно?

21
задан Community 23 May 2017 в 12:25
поделиться

5 ответов

Нет, C # не поддерживает это. Вы можете приблизиться к этому с помощью:

private static System.Text.RegularExpressions.Regex re =
         new System.Text.RegularExpressions.Regex("\\(copy (\\d+)\\)$");

private static string AppendCopyToFileName(string f)
{

}

Единственное отличие здесь - видимость 're'. Он предоставляется классу, а не только методу.

Переменная re будет инициализирована в первый раз, когда содержащий класс каким-либо образом используется. Так что держите это в специализированном небольшом классе.

11
ответ дан 29 November 2019 в 21:17
поделиться

К сожалению, нет. Мне очень понравилась эта возможность в 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.

5
ответ дан 29 November 2019 в 21:17
поделиться

А как насчет этого, поскольку вы хотите, чтобы он инициализировался, только если он используется:

private static System.Text.RegularExpressions.Regex myReg = null;
public static void myMethod()
{
    if (myReg == null)
        myReg = new Regex("\\(copy (\\d+)\\)$");
}
2
ответ дан 29 November 2019 в 21:17
поделиться

Конечно. Вам просто нужно объявить частную статическую переменную вне метода.

    private static readonly System.Text.RegularExpressions.Regex re = new System.Text.RegularExpressions.Regex( "\\(copy (\\d+)\\)$" );
    private static string AppendCopyToFileName( string f )
    {
        //do stuff.
    }

Фактически это именно то, что вы делаете, с той лишь разницей, что «re» имеет видимость для всего класса, а не только для метода.

0
ответ дан 29 November 2019 в 21:17
поделиться

Почему бы не создать в своем классе статический член только для чтения и, возможно, инициализировать его в статическом конструкторе?

Это даст вам такое же преимущество в производительности - он будет инициализирован только один раз.

5
ответ дан 29 November 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: