“全局变量”和“字段”的区别是什么?

10

Fields是类或结构体内的变量,局部变量位于方法内部,而全局变量可以在任何范围内访问(包括类和方法)。

这让我想到fields可能是全局变量,但是全局变量不一定是fields,尽管我无法想象出一个坐落在类外部的变量。

这两者之间是否有明显的区别?


谢谢Henk,我不知道这个,为什么C#中没有“全局变量”,这是否意味着“字段”概念与“全局变量”非常相似? - Arthur Mamou-Mani
4个回答

7
您将此标记为C#,但实际上C#并没有真正意义上的“全局变量”。

但是一个public static字段(或属性)会接近于全局变量。static使其成为单一的,并赋予了它“全局”的生命周期。


谢谢Henk,我不知道这个,为什么C#中没有“全局变量”,这是否意味着“字段”概念与“全局变量”非常相似? - Arthur Mamou-Mani
1
“static” 的概念非常接近于“全局”。实例字段则完全不是全局的。而且无论如何,具有相同作用域和修饰符的属性与字段一样(不)是全局的。 - H H

3
我认为维基百科的定义在这里是合适的:
在面向对象编程中,字段(也称为数据成员或成员变量)是封装在类或对象中的数据。对于常规字段(也称为实例变量),对于对象的每个实例都有一个实例变量:例如,Employee类具有Name字段,并且每个员工都有一个不同的名称。静态字段(也称为类变量)是一个变量,由所有实例共享。
因此,全局变量基本上是静态字段(因此是字段)。

谢谢KooKiz,Henk Holterman在下面说C#没有全局变量。你在这里使用了编程上更广泛的术语。static关键字只能用于字段吗?还是也可以用于全局变量? - Arthur Mamou-Mani
1
对我而言,全局变量是可以在每个作用域中访问的变量。因此,C# 的静态变量就是全局变量。@ArthurMamou-Mani - Kevin Gosse

1

全局变量是可以在整个范围内访问的变量,通常使用 static 类来实现。示例代码:

public class Demo {
    public static string ThisIsGlobal = "Global";
    private string _field = "this is a field in the class";
    public void DoSomething()
    {
        string localVariable = "Local";
        string localVariable2 = ThisIsGlobal; // VALID
    }

    public static void GlobalMethod()
    {
        string localVariable = _field; // THIS IS NOT VALID!
    }
}

许多人说全局变量和状态是不好的,但只要你使用它应该使用的方式,我并不这么认为。在上面的例子中,ThisIsGlobal 是一个全局变量,因为它有 static 关键字。正如你在例子中看到的,你可以从实例方法访问静态变量,但不能从静态方法访问实例变量。

非常感谢您,Tomas。Henk Holterman说c#没有“全局变量”,但是您在这里使用了它们。static关键字是否也可以用于“全局变量”? - Arthur Mamou-Mani
为了使其全局化,它还必须是“public”。全局变量是一个抽象的概念,它不一定是一个变量。如果您正在使用单例模式,那么它也是一个“全局变量”。或者,如果您将其更加高级并使用依赖注入,但只有一个对象实例,则该对象也是全局变量。但在C#中,最简单的形式是使用static,但不能说它是全局的,因为它是static。它可以是private static,这并不使它成为“全局”的,在这种情况下,它被该类型的所有实例共享。 - Tomas Jansson

0

许多变量位于类的特定实例之外,但它们仍然都包含在“某个”类中。基本上,全局变量位于对象图的顶部 高空中,可以被对象图中后面/较低的所有类/成员看到/引用。

但是全局变量仍然只是某个类/模块的字段。


谢谢rism,一个变量要有多高才能成为全局变量?还是它是相对位置?全局变量是其他东西的字段吗?最后,我能可视化这个对象图吗? - Arthur Mamou-Mani
1
就个人而言,如果有人谈论全局变量,我会期望在对象图的顶部附近找到它,如果不是在应用程序的主入口对象上,就是在专门用于此类事物的“指定”区域中,例如 Web 应用程序中的 Global.asax,即每个请求都会处理的内容。毫无疑问,就像往常一样,这取决于具体情况,我知道这并不总是令人满意。 - rism

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接