我只是好奇为什么我们必须使用类的对象才能访问类成员?我的意思是我知道我们可以在不创建对象的情况下访问静态成员。但是为什么我们不能在不使用对象的情况下访问其他类成员呢?这背后的实际机制是什么?
例如,请查看以下代码:
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变量,为什么我们不能直接访问它?
答案 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文章对此主题有不同的大而深入的解释,我建议你阅读。