为什么我们必须使用object来访问类成员?

时间:2014-03-25 20:02:59

标签: c# object

我只是好奇为什么我们必须使用类的对象才能访问类成员?我的意思是我知道我们可以在不创建对象的情况下访问静态成员。但是为什么我们不能在不使用对象的情况下访问其他类成员呢?这背后的实际机制是什么?

例如,请查看以下代码:

public class Taxi
{
    public bool isInitialized;

    public Taxi()
    {
        isInitialized = true;
    }
}

class TestTaxi
{
    static void Main()
    {
        Taxi t = new Taxi();
        Console.WriteLine(t.isInitialized);
        Console.ReadKey();
    }
}

为什么我们必须使用object打印isInitialized变量,为什么我们不能直接访问它?

6 个答案:

答案 0 :(得分:2)

因为实例成员与特定实例相关。如果你问一个特定的出租车是否已初始化,这是有意义的,但是询问一般的出租车是否已初始化是没有意义的。

isInitialized不是推理最明显的成员;如果对你更有意义,请考虑Color

编辑:我认为让您感到困扰的是,您无法直接使用isInitialized方法访问Main,即使它位于同一课程中。原因是Main静态方法,这意味着它不属于该类的特定实例。当您在实例方法中编写isInitialized时,它实际上是this.isInitialized的简写,但静态方法中没有this

答案 1 :(得分:2)

考虑以下代码:

public class Taxi
{
    public bool isInitialized;

    public Taxi()
    {
        isInitialized = true;
    }
}

class TestTaxi
{
    static void Main()
    {
        Taxi t1 = new Taxi();
        Taxi t2 = new Taxi();
        t2.isInitialized = false;
        Console.WriteLine(t1.isInitialized);
        Console.WriteLine(t2.isInitialized);
        Console.ReadKey();
    }
}

在这种情况下,您可以清楚地看到两个实例是不同的。在这种情况下,问“一般来说isIitialized字段的价值是多少?”是没有意义的。因为它可以根据实例而有所不同。有意义的是问“此对象实例的isInitialized字段的值是多少?”

答案 2 :(得分:1)

Object Oriented Programming有答案。

有两种主要类型的成员,静态和实例。静态成员适用于所有类实例,实例成员适用于单个实例。如果您的代码中有多个Taxi对象,该怎么办?每个Taxi对象都有自己的状态。您是否会假设每个Taxi都已初始化?

由于您的字段未标记为static,因此每个实例都会对其进行维护,这就是您需要类实例访问该字段的原因。

答案 3 :(得分:0)

因为isInitialized是对象的特定实例的属性。

考虑您是否将此属性添加到您的班级:

public string Color { get; set; }

现在问一下特定的实际出租车的颜色是否合理?或者你能问一下班级出租车吗?由于出租车可以是任何颜色,您需要指定您正在谈论的出租车。

Taxi myTaxi = new Taxi();
myTaxi.Color = "Blue";
Taxi someOtherTaxi = new Taxi();
myTaxi.Color = "Yellow";

同样,您的出租车要么已初始化,要么已初始化。询问是否所有的出租车都被初始化是没有意义的,只有特定的出租车才是。

根据您所查看的实际领域,可能会认为您的所有Taxi都属于属于一家公司的船队,因此,它们应该都是相同的颜色。在这种情况下,将其设为静态可能是有意义的:

public static string Color { get; set; }

现在您不需要实例来访问颜色,因为它现在是此类的所有实例共享的属性。这使得重新粉刷出租车变得更加容易:

Taxi.Color = "Blue";        // Now ALL my taxis are blue

答案 4 :(得分:0)

假设您有一个班级Bicycle

Class Bicycle
{
    public string SerialNumber {get; set;}
    ...
}

如果您首先没有SerialNumber,那么获取Bicycle是否有意义?

答案 5 :(得分:0)

必须使用该对象来访问类成员的原因是因为范围。

  

变量的范围(有时称为变量的可访问性)指的是变量可以从中读取和/或写入的位置,变量的生命周期,或者它在内存中保留的时间。 - MSDN - Definition of Scope

isInitialized变量的范围限定为Taxi类。由于Taxi是非静态的,因此必须进行实例化(创建实例)才能使用。一旦创建,除了访问一个成员变量之外,还有很多工作要做。

它可以作为出租车的独特实例传递,也许可以用于大量的出租车。它可以用来做一些类型的推断。也许有一种方法可以与作为出租车类一部分的数据库进行通信。出租车的成员也可以是私人或内部的,仅用于计算或不公开访问。总而言之,拥有实例化对象意味着远远超过访问单个变量。

如果将isInitialized限定为范围或与TextTaxi共享范围,则可以在没有对象引用的情况下使用它。

上面链接的MSDN文章对此主题有不同的大而深入的解释,我建议你阅读。