C# 全局访问与局部变量

C# 全局访问与局部变量,c#,C#,我有两个对象,我将主要在单个类中使用。我将在开始时初始化它们,并在程序的整个生命周期中使用它们。现在,我的问题是,如果我只是将它们创建为全局变量,并在代码中的任何地方访问它们(在单个类中),或者我应该将它们创建为局部变量,并将它们作为参数传递给其他函数。我只是想看看什么是最好的编程实践 我用的是C# 谢谢。一般来说,您应该避免使用全局变量。如果可行的话,我建议将它们保留为局部变量,并将它们作为参数传递给函数 正如Josh所指出的,如果这些变量只在类的单个实例中使用,那么您应该将它们设置为该类的私

我有两个对象,我将主要在单个类中使用。我将在开始时初始化它们,并在程序的整个生命周期中使用它们。现在,我的问题是,如果我只是将它们创建为全局变量,并在代码中的任何地方访问它们(在单个类中),或者我应该将它们创建为局部变量,并将它们作为参数传递给其他函数。我只是想看看什么是最好的编程实践

我用的是C#


谢谢。

一般来说,您应该避免使用全局变量。如果可行的话,我建议将它们保留为局部变量,并将它们作为参数传递给函数

正如Josh所指出的,如果这些变量只在类的单个实例中使用,那么您应该将它们设置为该类的私有(或受保护)成员,然后使用它。当然,它们只能作为参数传递给具有相同访问级别(即private)的其他方法


可选地,您可以考虑使用略微更干净(更好)的使用全局变量的方法。

< P>如果对象的范围是它们实例化的类的生存期,那么它们应该是私有成员变量。

如果它们本身不维护状态,那么您应该使它们成为静态类

您仍然应该将它们作为变量传递,或者至少创建属性访问器以获取支持字段。通过这种方式,您可以在不破坏代码的情况下更改实现细节


当考虑这些事情时,是一个很好的起点。

如果对象对于类的每个实例都是相同的,那么

static const double PI = 3.14158;

您通常应该使用访问器方法(例如getter和setter),并保持内部变量的私有性。这样,类之外的其余代码就不依赖于实际变量


请参阅教程。

如果您的类依赖于这两个对象,则它们可能是类本身的成员。类似这样(其中A是您正在谈论的类,B是您初始化的对象之一:

public class A
{
    private B _b;

    public A(B b)
    {
        _b = b;
    }

    public void DoSomething()
    {
        //do something with _b;
    }

    private void DoSomethingElse()
    {
        //do something else with _b;
    }
}
在本例中,A依赖于B(因此您可以将B的实例传递到A的构造函数中或通过某种依赖注入框架)。对于类
A
上的每个方法来说,需要将
B
类型的参数传递给它是没有多大意义的

我有两个我将成为的对象 主要用于单个类的内部 将在开始时初始化它们 并在整个生命周期中使用它们 节目

这听起来是使用
私有静态只读
变量的最佳时机。这些变量可以在它们的声明中初始化,也可以创建静态构造函数来初始化它们


事实上,您只在单个类中引用这些对象是关键。如果在单个类之外需要这些对象,还有其他更好的方法来做这些事情。

我认为在这种情况下,您应该问什么更有意义。这两个对象和新类之间是否存在某种关系。还有,多久一次他们在课堂上使用


通常,如果只有两个方法使用对象,则传递它们,否则,将它们实例化为类级变量(可能使用Jefferey建议的私有静态只读)让代码更具可读性应该是你的目标。

我知道你应该避免使用全局变量,我一直使用单例变量,但是你怎么在.NET中创建全局变量呢?你可以定义一个
Public Static
string/int/float/etc变量,这个变量实际上是全局变量。但我同意与其他语言(如C)相比,在C#中确实不是一个“全局”概念。也许我应该在我的回答中更清楚这一点。Net确实支持全局变量甚至全局方法。但C#的语法不支持(这可能是一件好事。)感谢singleton实现站点。这确实对我有很大帮助:)