我对编程很新。实际上不到一个月前,我甚至无法命名3种编程语言。所以我对此真的很陌生。
在我理解了OOP中的类概念和对象概念后,我意识到整个程序中存在的每个项目都是一个对象或一个准备放弃对象的类。
除了对象的描述之外,类不是主要的和唯一的玩家。
此外,函数或方法不是现有对象的行为表现形式。
(我想知道我们为要执行的函数编写的代码行,代码行本身是一个新对象,它引用将执行我们想要的函数的现有原始对象,作为其行为的一部分)
现在,如果我提到的几乎是正确的,那么在我理解OOP这个世界中让我感到很困惑的是,每个项目都是被利用或破坏的对象,或者是在一个类中存在的(蓝图) ),这只不过是对象如何出生的可修改的书面描述。
让我感到困惑的是“系统”,“控制台”和“命名空间”的本质,它们中的每一个,它是一个对象,以便我们可以调用和利用它而无需实例化,或者它们很容易成为特殊类实例化为程序运行,或者只是普通的类(与我理解的所有内容相矛盾),因为我可以看到“系统”和“控制台”仅被调用和使用,并且从未实例化(就像对象一样)
现在,命名空间似乎是一个被实例化为写入脚本中的对象的类:(命名空间“应用程序名称”{})但是“系统”和“控制台”似乎都没有被程序员实例化!
答案 0 :(得分:2)
System
是namespace,Console
是命名空间System
内的static class。
静态类是不需要使用new
关键字创建的类,每个应用程序只有一个实例(不包括模板化静态类 - 您不必为此担心力矩)
Console
可以这样写:
namespace System { //Namespace defined here!
public static class Console { //Static class defined here!
public static void WriteLine() { //Static method defined here!
//Implementation goes here
}
}
}
在声明类时请注意关键字static
。删除此关键字会将其转换为普通类,您必须像这样使用它:
var console = new System.Console();
console.WriteLine();
基于Bauss和Physician关于静态方法的评论。
你也可以这样写:
public class MyClass
{
public static void DoSomethingStatically()
{
}
public void DoSomethingNormally()
{
}
}
现在,你可以这样做:
MyClass.DoSomethingStatically();
但你不能做:
MyClass.DoSomethingNormally();
要使用第二种方法,您必须创建一个实例:
var myClass = new MyClass();
myClass.DoSomethingNormally();
注意:
您无法在实例上调用静态方法,因此执行以下操作无效:
var myClass = new MyClass();
myClass.DoSomethingStatically();
答案 1 :(得分:0)
您可以将名称空间视为类的容器。 System
是包含Console
类的命名空间。 Console
是一种特殊类,称为静态类。静态类由static
关键字表示。 Console
类的声明看起来像这样:
namespace System {
public static class Console {
//lots of stuff...
}
}
实际上,您可以在http://referencesource.microsoft.com
中阅读Console
课程的源代码
无法实例化静态类。它只是做自己的工作。它没有对象。其中一个原因是拥有对象没有意义。例如,Math
类是一个静态类,因为说“让我们创建一个Math对象!”是没有意义的。因为Math不像Cows或Stream
s或BinaryFormatter
,它们都是非静态类通常,任何可以用“a”作为前缀的东西都不是静态的。 “a Stream”,“BinaryFormatter”等。
现在为名称空间概念。你知道,根据具体情况,有时同一个词可能意味着不同的东西。例如流,在编程上下文中,它表示文件流或某种其他类型的流。但是在一个随意的谈话中,你说流意味着一股水流或类似的东西。所以现在你必须创建两个流类,但名称冲突!这就是我们拥有名称空间的原因。让我们看一个真实的例子。至少有两个名为Path
的类,但它们位于不同的名称空间中,因此可以使用相同的名称。一个位于System.Drawing
命名空间中,另一个位于System.IO
命名空间中。我们经常将这两个类称为“System.IO.Path”和“System.Drawing.Path”。或者您可以编写using
指令。
结论:
System
和Console
都是不是对象。它们分别是命名空间和静态类。命名空间一词表示命名空间,因此它也不是一个对象。