dotNet / C#: проверить, была ли объявлена ​​переменная - PullRequest
0 голосов
/ 21 апреля 2020

Я не могу найти ответ на мою проблему. В dotNet / C# можно ли проверить, была ли объявлена ​​переменная какого-либо типа, а если нет, объявить ее? Спасибо

[Edit] В этом случае C# используется в качестве языка предварительного исполнения в Open Text CMS. Код C# можно использовать в любом модуле. Использование необъявленной переменной приводит к трудностям при отладке ошибок, равно как и двойное объявление переменной. Вот почему я хотел бы проверить.

[Edit2] Да, он, скорее всего, где-то скомпилирован, но ошибки генерируются (или, скорее, не генерируются) во время выполнения

[Edit3] Дальнейшее объяснение :
В открытом тексте каждая страница может содержать несколько модулей, несколько экземпляров модуля и один и тот же экземпляр модуля несколько раз. В каждом модуле вы можете использовать C# в качестве языка «предварительного исполнения». Это в основном очень простой сценарий для маневрирования вокруг недостатков OpenText. Вы вводите небольшие переменные, устанавливаете их в true или false, и через три строки пишете условие на основе переменной. Мы можем (и можем) объявить группу переменных в блоке инициализации страницы, но поскольку их так много, было бы полезно иметь возможность проверить, была ли объявлена ​​переменная, а если нет, объявить ее.
I как идея изменить это на словарь ключ / значение, но это действительно большой сайт с множеством страниц / модулей и экземпляров, и я ищу рабочее решение, не меняя целиком.
Фактический код действительно Просто чаще всего это время:

var hasHeadline = false; // this will throw an error if hasHeadline was declared before
hasHeadline = true; // if some CMS condition is met. this will throw an error if hasHeadline wasn't declared
if(hasHeadline) { ** CMS code ** }

Как я уже сказал, это проявится во многих случаях, над которыми я не имею полного контроля. В результате «ошибка» будет заключаться в том, что весь кодовый блок удаляется со страницы.

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Объявите одну переменную dynamic, например, ExpandoObject.

dynamic Globals = new ExpandoObject();

Используйте эту переменную для хранения всего вашего глобального состояния.

Globals.hasHeadline = false;  //No declaration needed, so 
Globals.hasHeadline = true;   //no chance of a duplicate declaration
0 голосов
/ 21 апреля 2020

Там нет необходимости. C# является статически типизированным языком программирования («тип» означает больше, чем просто class, struct и interface: «stati c typing» означает «типы» ( формы) данных, объектов и значений в вашей программе известны статически - т.е. во время компиляции). Если что-то не объявлено в области видимости, ваш код просто не будет компилироваться.

Это также относится к локальным переменным (локальные переменные, параметры метода и т. Д. c).

Это выиграно ' t compile:

class Foo
{
    void Foo( String x )
    {
        if( z > 0 ) { // `z` isn't declared as a field, parameter or local.
            // ...
        }
    }
}


Аналогично, это не скомпилируется:

class Foo
{
    public string x;
}

class Bar
{
    void Baz( Foo foo )
    {
        if( foo.z > 0 ) { // `z` is not declared in `Foo`

        }
    }
}

Тем не менее, есть некоторые вещи, которые необходимо проверить перед использованием в C#, такие как:

  • Обнуляемые ссылки или обнуляемые значения.
  • Записи в словаре или другой коллекции ключей.
  • Проверка типов, когда требуется известный подкласс или интерфейс (Поскольку C# по-прежнему не поддерживает алгебраические типы c, grrrr)

... но ни один из них не включает проверку объявлений .

...