【问题标题】:dotNet/C#: Check if a variable was declareddotNet/C#:检查是否声明了变量
【发布时间】:2020-04-21 09:08:17
【问题描述】:

我找不到问题的答案。在 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 ** }

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

【问题讨论】:

  • 编译器会为你处理。您不能引用未声明的变量。
  • 我在您声称“C# 未编译”的情况下遇到问题。那根本不可能。 C# 不能被“解释”或以其他方式逐行执行,因为 C# 语言是围绕编译成 CIL 而明确设计的。我认为您误解了 OpenTextCMS 如何使用 C#。您能否提供指向他们的文档或其他声称 C# 在 OpenTextCMS 中“未编译”的来源的链接?
  • 除了在 C# 编译中已经说过的所有内容之外,也许您遇到了 X/Y 问题。也许您需要的是一个键值对字典。在这种情况下,很容易在字典中创建条目(如果不存在)。请添加一些关于你想要实现的细节。
  • @Dai 我真的不在乎它是否编译以及在哪里编译。我的问题是非和双重声明都不起作用,我无法调试它,因为我无权访问正确的日志。我正在寻找一种方法来防止这种情况发生。

标签: c# .net opentext


【解决方案1】:

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

dynamic Globals = new ExpandoObject();

使用这个变量来存储你所有的全局状态。

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

【讨论】:

  • 谢谢!这是一个很棒的想法,我可以在正在运行的项目中轻松实现
【解决方案2】:

没必要。 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# 中使用前需要检查一些事情,例如:

  • 可为空的引用或可为空的值。
  • 字典或其他键控集合中的条目。
  • 需要已知子类或接口时的类型检查(因为 C# 本身仍然不支持代数类型,grrrr)

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

【讨论】:

  • 这是一种特殊情况,因为我们在 Open Text CMS 中使用 C# 作为预执行语言。它没有被编译。
  • @thomas OpenText 仍然使用csc 将 C# 编译为 CIL(否则它不会是 C#)。如果您认为我的回答不准确或不适用于您的案例,请更新您的问题发布,并举例说明您需要检查某个值是否存在。
猜你喜欢
  • 2015-08-25
  • 2012-01-01
  • 2018-05-01
  • 1970-01-01
  • 2022-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
相关资源
最近更新 更多