dotNet/C#:检查是否声明了变量



我找不到问题的答案。在dotNet/C#中,是否可以检查变量是否声明为某种类型,如果没有,则声明它?感谢

[编辑]在这种情况下,C#被用作Open Text CMS中的预执行语言。C#代码可以用于任何模块。使用未声明的变量会引发难以调试的错误,双重声明变量也是如此。这就是我想检查的原因。

[Edit2]是的,它很可能是在某个地方编译的,但错误是在运行时上抛出的(或者更确切地说不是抛出的(

【Edit3】进一步解释:
在Open Text中,每个页面可以容纳多个模块、一个模块的多个实例以及一个模块同一实例若干次。在每个模块中,您都可以使用C#作为"预执行"语言。这是一个非常简单的脚本,可以绕过OpenText的缺陷。引入小变量,将它们设置为true或false,三行之后根据变量编写条件。我们可以(并且确实(在页面的初始化块中声明一堆变量,但由于变量太多,因此能够检查是否声明了变量会有所帮助,如果没有,声明它。
我喜欢将其更改为键/值字典的想法,但这是一个非常大的网站,有大量的页面/模块和实例,我正在寻找一个不更改整个内容的有效解决方案
实际的代码在大多数时候都很简单:

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 ** }

正如我所说,这将出现在我无法完全控制的多个实例中。由此产生的"错误"将是从页面中剥离整个代码块。

声明一个dynamic变量,例如ExpandoObject。

dynamic Globals = new ExpandoObject();

使用此变量可以存储所有全局状态。

Globals.hasHeadline = false;  //No declaration needed, so 
Globals.hasHeadline = true;   //no chance of a duplicate declaration

没有必要。C#是一种静态类型编程语言("类型"不仅仅指classstructinterface:"静态类型"意味着程序中数据、对象和值的"类型"(形状(是已知的静态-即在编译时(。如果某个内容没有在作用域中声明,那么您的代码就不会编译。

这也适用于局部变量(局部变量、方法参数等(。

这不会编译:

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#中使用之前,您确实需要检查一些内容,例如:

  • 可为null的引用或可为null值
  • 字典或其他键控集合中的条目
  • 当你想要一个已知的子类或接口时进行类型检查(因为C#本身仍然不支持代数类型,grrrr(

。。。但这些都不涉及检查声明

最新更新