【问题标题】:What is a class?什么是班级?
【发布时间】:2023-03-14 14:13:01
【问题描述】:

我可以想象当你看到我的问题标题时的第一反应:“你怎么能在这里有这么高的声誉,却忽略了一个类是什么?”

我的观点如下:直到现在,我一直在使用 C++、Delphi、Java,... 这很简单:类是对象的类型定义。您需要在内存中保留一些空间才能开始使用它(因此是构造函数),然后不要忘记释放该内存(如果您的编程语言不支持垃圾回收)。

然而,今天我遇到了一个关于 C# 中类型定义和常量的问题,然后我想到了this URL,提到了这样的源代码:

class Calendar1
{
  public const int Months = 12;
}

为了使用它,你只需要这样做:

using Calendar1;

您可以使用Months 作为常量。

但这是我的问题:构造函数在哪里?如果这个类是一个对象的类型定义,那我们说的是哪个对象呢?

所以,如果我理解正确的话,C# 是基于“一切都是类”的思想,但是为了使这个工作,C# 的发明者扩展了类的定义,所以现在我们得到(C# 定义) :

类是以下之一:

  • 对象的类型定义。在这种情况下,需要一个构造函数来创建对象。
  • ...

有人可以完成定义吗?

【问题讨论】:

  • 我怀疑你的意思是using static Calendar1; 否则它不会编译。编译器提供了一个构造函数,但您不需要它,因为所有常量都是静态的——您不需要Calendar1 的实例来访问Monthsconst 隐含的静态特性是否让您感到困惑?
  • 也许this 可以帮忙?
  • 如果类是静态类,你只能做using static Calendar1。在 Entity Framework 中为 dtos 和实体工作时,他所做的很好并且很常见。
  • "A class is a data structure that may contain data members (constants and fields), function members (methods, properties, events, indexers, operators, instance constructors, destructors and static constructors), and nested types." - 来自the C# standard。 (我要补充一点:成员可能是静态的或非静态的。)

标签: c# programming-languages theory


【解决方案1】:

这是 C# 中非常常见的做法。类通常用于创建“sacks”来保存常量,或者通常作为实体或 dto 对象。这些通常是在没有用户定义的构造函数的情况下制作的。如果一个类没有构造函数,则在编译时定义一个构造函数,相当于一个空的构造函数:

public Calendar1()
{
}

这个答案更详细: C# class without constructor

【讨论】:

    【解决方案2】:

    你不需要这个usingusing 是为了让命名空间可用。

    • 常量是静态的。这意味着它不是实例成员,而是类型的成员。因此,您可以通过类型名称访问它:Calendar1.Months,或者使用 using static Calendar1;Months
    • 在 C# 中,如果您没有显式声明一个无参数公共构造函数,则类会隐式创建一个。

    【讨论】:

      【解决方案3】:

      当你创建一个类的实例时,你正在分配内存(使用关键字new) 常量不是在运行时创建的,它们是在编译时创建的并存储在程序集元数据中。因此,当您访问常量时,您将不会访问类的实例 - 您将直接从元数据中访问常量。 看看这个帖子: How are C# const members allocated in memory?

      【讨论】:

        猜你喜欢
        • 2011-09-09
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        • 2018-09-07
        • 2010-10-30
        • 2018-05-20
        • 2013-09-17
        相关资源
        最近更新 更多