dotNet/C#: 检查变量是否被声明
dotNet/C#: Check if a variable was declared
我找不到问题的答案。在 dotNet/C# 中,是否可以检查变量是否声明为某种类型,如果没有,则声明它?
谢谢
[编辑] 在这种情况下,C# 用作 Open Text CMS 中的预执行语言。 C# 代码可以在任何模块中使用。使用未声明的变量会引发难以调试的错误,双重声明变量也是如此。这就是为什么我想检查一下。
[Edit2] 是的,它很可能是在某处编译的,但是在运行时会抛出(或者更确切地说不抛出)错误
[Edit3]进一步解释:
在 Open Text 中,每个页面都可以包含多个模块、一个模块的多个实例以及一个模块的同一个实例多次。在每个模块中,您都可以将 C# 用作 "pre-execute" 语言。这主要是非常简单的脚本来解决 OpenText 的失败。您引入小变量,将它们设置为 true 或 false,三行之后写一个基于变量的条件。我们可以(并且确实)在页面的初始化块中声明一堆变量,但由于有这么多变量,因此能够检查是否声明了变量以及如果没有声明它会有所帮助。
我喜欢将其更改为 key/value 字典的想法,但这是一个非常大的站点,有大量 pages/modules 和实例,我正在寻找一个无需更改整个内容的可行解决方案。
大多数时候,实际代码非常简单:
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 ** }
正如我所说,这将出现在我无法完全控制的多个实例中。结果 "error" 将整个代码块从页面中剥离。
没必要。 C# 是一种静态类型 编程语言("type" 不仅仅指 class
、struct
和 interface
:"static typing" 表示程序中的数据、对象和值的 "types"(形状)是已知的
静态 - 即在编译时)。如果某些内容未在范围内声明,那么您的代码将无法编译。
这也适用于局部变量(局部变量、方法参数等)。
这不会编译:
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# 仍然不原生支持代数类型,grrrr)
...但其中 none 涉及检查 声明。
声明一个 dynamic
的变量,例如一个 ExpandoObject。
dynamic Globals = new ExpandoObject();
使用这个变量来存储你所有的全局状态。
Globals.hasHeadline = false; //No declaration needed, so
Globals.hasHeadline = true; //no chance of a duplicate declaration
我找不到问题的答案。在 dotNet/C# 中,是否可以检查变量是否声明为某种类型,如果没有,则声明它? 谢谢
[编辑] 在这种情况下,C# 用作 Open Text CMS 中的预执行语言。 C# 代码可以在任何模块中使用。使用未声明的变量会引发难以调试的错误,双重声明变量也是如此。这就是为什么我想检查一下。
[Edit2] 是的,它很可能是在某处编译的,但是在运行时会抛出(或者更确切地说不抛出)错误
[Edit3]进一步解释:
在 Open Text 中,每个页面都可以包含多个模块、一个模块的多个实例以及一个模块的同一个实例多次。在每个模块中,您都可以将 C# 用作 "pre-execute" 语言。这主要是非常简单的脚本来解决 OpenText 的失败。您引入小变量,将它们设置为 true 或 false,三行之后写一个基于变量的条件。我们可以(并且确实)在页面的初始化块中声明一堆变量,但由于有这么多变量,因此能够检查是否声明了变量以及如果没有声明它会有所帮助。
我喜欢将其更改为 key/value 字典的想法,但这是一个非常大的站点,有大量 pages/modules 和实例,我正在寻找一个无需更改整个内容的可行解决方案。
大多数时候,实际代码非常简单:
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 ** }
正如我所说,这将出现在我无法完全控制的多个实例中。结果 "error" 将整个代码块从页面中剥离。
没必要。 C# 是一种静态类型 编程语言("type" 不仅仅指 class
、struct
和 interface
:"static typing" 表示程序中的数据、对象和值的 "types"(形状)是已知的
静态 - 即在编译时)。如果某些内容未在范围内声明,那么您的代码将无法编译。
这也适用于局部变量(局部变量、方法参数等)。
这不会编译:
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# 仍然不原生支持代数类型,grrrr)
...但其中 none 涉及检查 声明。
声明一个 dynamic
的变量,例如一个 ExpandoObject。
dynamic Globals = new ExpandoObject();
使用这个变量来存储你所有的全局状态。
Globals.hasHeadline = false; //No declaration needed, so
Globals.hasHeadline = true; //no chance of a duplicate declaration