在整个类中使用创建的对象

本文关键字:创建 对象 | 更新日期: 2023-09-27 18:06:38

好的。我会尽量有条理地提出我的问题。

我正在做的是一个显示应用程序的天气图。没有什么大的,只是为了更好地理解编程而创建的东西。我有一个工作原型,我对此感到兴奋,所以我想知道是否可以让它更有组织性和专业性。

我正在尝试使用struct作为"State"对象的蓝图。结构中有几个字段用于为对象分配"属性"。

State Louisiana = new State(); Louisiana.name = "Louisiana";

现在,这太棒了。它做我想做的事。然而,我在理解如何正确使用它时遇到了问题我有一个名为StateInitialization((的方法,它创建50个结构实例,每个实例对应一个状态。但是,在该方法之外,我不能使用,甚至不能访问创建的State实例,也不能访问属性

我希望能够在同一类的不同方法中执行类似Louisiana.SetIDInfo("LA", "Louisiana", 32);的操作。或者,我希望能够在方法中设置一个等于对象属性之一的变量:string MyString = Louisiana.name;这是不可能的,还是我严重误解了什么?

我用来作为构建结构参考的文章在这里。

这里有一个指向抽象结构代码的链接。StateInitialization((方法的链接在这里。

我链接的代码工作非常正常。问题是我用粗体字概括的。

我认为"static"的一些用法可能是不必要的或错误的。老实说,我不确定。这就是我请求帮助的原因。我们非常感谢任何协助。

在整个类中使用创建的对象

首先,一个关于struct的词。一般来说,结构应该只包含数据,并且是不可变的。您不必以这种方式实现它们,但通常的做法是在执行它们上的实例方法时使用class

经验法则:使用class而不是struct。只有当您知道为什么要这样做时,才使用struct

然而,这并不是破坏样本的原因。在你的生成函数的最底层,你有:

State[] USA = new State[] { .... };

正如你所想的那样,它创建了一个状态集合。但是,这一行声明了一个新的变量,这意味着它的作用域是函数。该函数之外的代码不知道它的存在。事实上,在函数的最后一行执行后,局部变量被称为"超出范围",将被垃圾收集。如果你改为写:

static State[] USA;
static void GenerateStates()
{
     ...
     USA = new State[] { ..... };
}

类中的所有其他方法都可以访问USA数组。请注意,这有点危险,因为您可以在调用GenerateStates之前尝试使用它,但我跑题了。

您还丢失了所有的局部变量(如Louisiana(,因此您将无法直接访问它们,除非您将它们也声明为类级变量。或者,你可以在数组中搜索一个名为"路易斯安那州"的州,并尝试使用它:

USA.First(s => s.name == "Louisiana").SomeMethod();

同样,还有很多其他方法可以实现这一点(脑海中浮现的是字典而不是数组(。如果不存在这样的状态,此方法将抛出异常,只是为了警告您。

你还问过静电。在标准控制台应用程序中,它被大量使用,但一旦你脱离了这个领域,你通常不会使用它。static允许你在没有实例的情况下使用类(它使用全局"静态"实例(。好的OOP通常不鼓励这种做法,但你不应该担心一段时间。