C# 在方法之间共享c变量?

C# 在方法之间共享c变量?,c#,C#,我有不同的方法如何在它们之间共享strHeaderFileName等变量? 例如,我需要btnSave\u Click方法中的strHeaderFileName protected void multiFileUpload_FileUploaded(object sender, FileUploadedEventArgs e) { // No Loop needed multiFileUpload_FileUploaded will be called for each file upl

我有不同的方法如何在它们之间共享strHeaderFileName等变量? 例如,我需要btnSave\u Click方法中的strHeaderFileName

protected void multiFileUpload_FileUploaded(object sender, FileUploadedEventArgs e)
{
    // No Loop needed multiFileUpload_FileUploaded will be called for each file uploaded
    var strHeaderFileName = e.File.FileName;
    // Use the filename as the Header Name
    var strHeaderName = strHeaderFileName.Replace(".jpg", "");
    // allow Underscore characters in FileName to become Spaces in the Display Name.
    strHeaderName = strHeaderName.Replace("_", " ");
}

protected void btnSave_Click(object sender, EventArgs e)
{
    // use the same strHeaderFileName value here?
}

在这种情况下,最合适的选项似乎是:使用实例字段:

string strHeaderFileName;

protected void multiFileUpload_FileUploaded(object sender, FileUploadedEventArgs e)
{
    // ...
    strHeaderFileName = e.File.FileName;
    // ...
}

protected void btnSave_Click(object sender, EventArgs e)
{
    // can use strHeaderFileName
}

有两种选择。由于这些方法是事件处理程序,不直接调用,因此这里的最佳方法可能是使变量类级别的成员:

private string strHeaderFileName;

protected void multiFileUpload_FileUploaded(object sender, FileUploadedEventArgs e)
{
    strHeaderFileName = e.File.FileName;
    // etc.
}

protected void btnSave_Click(object sender, EventArgs e)
{
    // here you can access strHeaderFileName
}
作为类级成员,它们将可由该类中的任何方法访问。确保它们是私有的,否则其他对象也可以访问它们,这在本例中可能是不需要的。它们将在该类的任何给定实例的生命周期内存在

还要注意,这看起来像ASP.NET,它在类实例方面的行为与WinForms之类的稍有不同。页面的任何给定实例都不会在请求之间持久存在。因此,如果在一个处理程序中设置值,再次显示页面,然后调用另一个处理程序,则该值将不再存在。这是因为每个页面的类实例是根据请求创建的,然后在响应后销毁

要跨页面请求持久化,需要将该值保留在其他位置。例如,如果它需要在该用户会话的范围内活动,则可以将其置于会话状态:

protected void multiFileUpload_FileUploaded(object sender, FileUploadedEventArgs e)
{
    Session["strHeaderFileName"] = e.File.FileName;
    // etc.
}

protected void btnSave_Click(object sender, EventArgs e)
{
    // here you can access Session["strHeaderFileName"]
}

根据值需要保留的范围,您还可以将其放在页面、cookie、数据库、某些缓存机制等中。

您可以将其设置为成员变量,而不是局部变量,例如

string strHeaderFileName;
string strHeaderName;

    protected void multiFileUpload_FileUploaded(object sender, FileUploadedEventArgs e)
{
    // No Loop needed multiFileUpload_FileUploaded will be called for each file uploaded
    strHeaderFileName = e.File.FileName;
    // Use the filename as the Header Name
    strHeaderName = strHeaderFileName.Replace(".jpg", "");
    // allow Underscore characters in FileName to become Spaces in the Display Name.
    strHeaderName = strHeaderName.Replace("_", " ");
}

protected void btnSave_Click(object sender, EventArgs e)
{
    // strHeaderFileName is now accessible here
}
将var strHeaderFileName声明为类的成员。 例如,如果这是一个页面

class Page
{
  private string strHeaderFileName;
 protected void multiFileUpload_FileUploaded(object sender, FileUploadedEventArgs e)
    {
        // No Loop needed multiFileUpload_FileUploaded will be called for each file uploaded
        strHeaderFileName = e.File.FileName;
        // Use the filename as the Header Name
        var strHeaderName = strHeaderFileName.Replace(".jpg", "");
        // allow Underscore characters in FileName to become Spaces in the Display Name.
        strHeaderName = strHeaderName.Replace("_", " ");
    }

    protected void btnSave_Click(object sender, EventArgs e)
    {
        // use the same strHeaderFileName value here?
       someFunctionUses(strHeaderFileName);
    }
}

阅读关于@GrantWinney的文章,我通常会将它们放在类的顶部,但不想滚动1000行代码将它们放在上面。。lol希望有另一种方法。我想我从来没有听说过我不想滚动作为不在类级别定义变量的理由before@JoJo:如果您的类有1000行代码,那么这本身就是一个问题,与类级别变量无关。听起来有些功能应该重构到其他对象中。无论如何,必须滚动到文件顶部一次并不是不做某事的理由。您的整个应用程序将无法放入单个查看器窗口中…代码片段仅用于浏览器可运行的代码,它不适用于c