【问题标题】:C# and Variable Scope in WinformsWinforms 中的 C# 和变量作用域
【发布时间】:2011-01-11 20:47:59
【问题描述】:

在 Winform 应用程序中,我希望实例化类中的数据可以被多个表单控件访问。

例如,如果我创建具有 name 字符串属性的 Class Foo,我想通过单击 Button1 来实例化 Foo a = new a(),当我单击 Button2 时,我希望能够到 MessageBox.Show(a.name)。可能有多个 Foo 实例,如果这很重要的话。

能够以这种方式使用类实例的最佳选择是什么?

【问题讨论】:

  • 谁负责FOO的实例?可以从多种形式改过来吗?
  • 我希望它可以通过多种形式访问/更改,当然。我不确定谁负责 FOO,因为这可能是我问题的答案。在使用 winforms 回答这个问题时,我对变量范围不够熟悉。

标签: c# winforms class scope


【解决方案1】:

类的私有字段或属性满足要求 - 此类字段可以被该类的所有方法访问。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {
        foo a;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            a = new foo();
            a.name = "bar";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (a != null && a.name != null)
                MessageBox.Show(a.name);
            else 
                MessageBox.Show("");
        }
    }

    public class foo
    {
        public string name { get; set; }

        public foo() { }
    }
}

如果您希望其他表单可以访问此变量,则需要将其公开(最好作为属性)-C# winform: Accessing public properties from other forms & difference between static and public properties

【讨论】:

  • 他的第二个要求是a 可以有不同的形式。编辑:还是没有?
  • 这正是我想要的。我能够创建一个类,并在表单范围内实例化一个 List ,并且所有表单对象都可以访问它。漂亮,谢谢!
  • 混乱,虽然我愿意,但这不是必需品。任何可以通过多种形式访问的进一步信息都会很棒。
【解决方案2】:

也许你只想要一个静态类

【讨论】:

  • 静态类是否适用于我需要该类的多个实例的情况?我将打开几个文件,并将相关信息解析为类的各种属性。我认为只有在不使用多个实例时才适合使用静态类。
【解决方案3】:

Winforms 只不过是一些由代码支持的图形元素。该代码可以拥有/创建对象,就像常规的“非winform”代码一样。相同的范围规则适用。

我猜如果你的问题更多的是“我的表单如何访问在它之外定义的共享状态”?创建一个静态类,或者在表单的类上有一个设置器,其他代码可以使用它来设置此共享状态。

【讨论】:

    【解决方案4】:

    您创建的表单只是另一个类,派生自Form。类存在于给定的命名空间中,因此您只需在应用程序表单共享的命名空间中创建 Foo 类。

    如果一个类被多个表单共享,那么通常你会将该类分离到一个单独的文件中。

    【讨论】:

      【解决方案5】:

      乔恩·斯基特 [C# MVP] 来宾帖子:不适用

      2:2007 年 5 月 15 日

      re:csharp 中的应用程序变量。


      5 月 15 日下午 12:04,控制频率 写道: 引用: csharp还是新手。我来自 C++ 背景。 > 在 C++ 中,我会在应用程序中创建一些顶级变量 班级。这些实际上是可以访问的全局变量 在整个应用程序中,因为应用程序对象是已知的。 > 这种做法的 csharp 等价物是什么? 我似乎无法将变量添加到“公共类程序”类和 从其他文件访问它们。 > 我可能遗漏了一些明显的东西。 基本上你想要公共静态字段(或者最好是属性)。

      另一种方法是单例: http://pobox.com/~skeet/csharp/singleton.html

      乔恩

      如有疑问,请查找由 John Skeet 签名的东西。发现于:http://bytes.com/topic/c-sharp/answers/646865-application-variables-csharp

      【讨论】:

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