在整个类中使用创建的对象
本文关键字:创建 对象 | 更新日期: 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通常不鼓励这种做法,但你不应该担心一段时间。