【问题标题】:C# Variable ScopingC# 变量作用域
【发布时间】:2018-10-04 20:41:02
【问题描述】:

我是 C# 新手,在 CMS 上写过一些东西,但我的背景主要是 JavaScript 相关的。也就是说,我在 OpenText Capture Center 的“脚本”客户端工作。执行下面的代码时出现错误“当前上下文中不存在名称'srfOnly'”

如果我将变量声明移动到函数内,我会得到相同的错误,如果我将它们移动到全局,我会得到相同的错误,但在不同的行号上。

如何在整个代码中访问变量 srfOnly 和 otherDocs?

    //Parameters:
    //DataPool data
    //ITrace trace

    // Checking if condition is fulfilled.
    if (checkDocuments(data))
    {
       // Getting batch field named 'cc_SkipValidation'.
       // Setting new value.

       DOKuStar.Data.Xml.Bool skipValidationField = data.RootNode.Fields["cc_SkipValidation"] as DOKuStar.Data.Xml.Bool;
       bool srfOnly = false;
       bool otherDocs = false;

        if(otherDocs == true)
        {
             skipValidationField.SetValue(false);
        }
        if(srfOnly == true && otherDocs == false)
        {
             skipValidationField.SetValue(true);
          skipValidationField.State = DataState.Ok;
        }

    }
    // !!! Closing bracket is neccessary !!!
    }
    // ------------------ Functions
    public bool checkDocuments(DataPool dataPool)
    {
        foreach (Document doc in dataPool.RootNode.Documents)
        {
             if (doc.Name == "ServiceRequestForm")
             {
               srfOnly = true;
             }
             else if (doc.Name != "ServiceRequestForm")
             {
                 otherDocs = true;
             }
        }


    trace.WriteInfo("Trace info for Validation of srfOnly = " + srfOnly);
    trace.WriteInfo("Trace info for Validation of otherDocs = " + otherDocs);

    // !!! No closing bracket needed !!!

【问题讨论】:

  • 您的格式已关闭,一些括号按顺序出现在同一列上。您可能想要编辑...
  • No closing bracket needed 这很有趣。
  • 同意没有右括号很有趣。这是从我为达到这一点而修改的软件提供的示例中获取的,并且在添加/移动括号时出错。
  • @Chris:C# 有一个鲜为人知的特性,它可以在“脚本”模式下使用,您可以在其中以“REPL”风格构建小示例程序;本质上,正如您所推测的,您输入的代码被添加为类的成员。大概这就是 OP 在这里所做的,尽管我不熟悉“OpenText Capture Center”。 (不过,我确实考虑在大学毕业后为 OpenText 工作;我相信那会很好,但我认为去微软是更好的选择。:-))
  • @Chris:一个我不知道答案的有趣问题是,OpenText 是否使用 C# 脚本 API 来构建有原则的、受支持的脚本解决方案,或者他们是否只是将代码 sn-ps 粘贴到ad-hoc方式在后台运行编译器; cmets 的存在表明这里和那里需要放置奇怪的右括号,这让我认为后者可能是这种情况。在不了解 OpenText 如何托管 C# 的情况下,我不确定原始发帖人的问题是否可以回答。

标签: c# scope opentext


【解决方案1】:

变量的范围受限于它们在代码中的位置。如果您在 if{} 块中声明变量,则该变量仅存在于该块中。如果您在类内部而不是在类方法中声明变量,则该变量可以被类中的每个方法访问。如果您希望项目中的每个类都可以访问一个变量,您通常会在公共静态类中声明它。

例如...

public static class GlobalClass
{
    public static string myGlobal="";    
}  

class myClass
{
    string myClassVariable = "";
    private void method()
    {
        //myGlobal is accessible using this
        GlobalClass.myGlobal ="some value";
        //myClassVariable is accessible here
        myClassVariable = "somevalue";
        if(condition)
        {
            //myClassVariable is also accessible here
            myClassVariable = "somevalue";
            string ifBlockVariable = "";
        }
        //ifBlockVariable is not accessible here
    }
}

【讨论】:

  • 你的代码有很多错误; Class vs classmyGlobal 需要是 static,等等。另请注意,拥有这样的全局变量是 C# 中的“最糟糕的做法”;不要鼓励它。
  • 是的错误。感谢您指出。它是徒手打字的。就回答 OP 的问题而言,制作 Global 类是您如​​何使变量在整个代码中可访问。当然,在大多数情况下,您可以将变量作为参数传递,但在某些情况下,拥有一个全局类很有用。
【解决方案2】:

变量只能在当前块(以及该块中的块)内访问。如果您想在 checkDocuments 方法中访问 srfOnly 变量,您可以将其作为参数传递:

public bool checkDocuments(DataPool dataPool, bool srfOnly)

如果您希望变量可以从类中的任何位置访问,您可以将其声明为类的属性或实例变量,如下所示:

private bool _srfOnly;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2012-05-02
    • 2016-04-19
    • 2014-01-15
    • 2018-01-20
    • 2011-01-11
    相关资源
    最近更新 更多