C#里类型初始化器和构造方法有啥区别 他们分别在啥情况下用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#里类型初始化器和构造方法有啥区别 他们分别在啥情况下用?相关的知识,希望对你有一定的参考价值。

其实类型初始化器只是一种语法糖这样写MyClass a=new MyClass filedOne="a" ,filedTwo="b" ;会被编译器编译成和如下结构相同的IL代码MyClass a=new MyClass();a.filedOne="a";a.filedTwo="b";所以从CLR公共语言运行时的角度来看,它们完全一样,没有任何区别。
为什么C# 3.0要引入这一概念?如楼上说的那样 “ 构造函数是在你声明......” 这样一来我们写代码可以更灵活。其实C#的语法糖还很多,像可空类型和LINQ,全都是语法糖,是编译器帮我们做了背后的工作。不过我们还是不能小瞧它们,至少在思考问题的方式上它们是创新的。
参考技术A 构造函数是在你声明一个类的时候可以允许你动态传入初始化参数的。而初始化器发生在一个类产生之后(new了之后,且初始化是代码中写死的,不能动态修改的)

python中的构造函数和初始化程序有啥区别? [复制]

【中文标题】python中的构造函数和初始化程序有啥区别? [复制]【英文标题】:What is the difference between a constructer and initializer in python? [duplicate]python中的构造函数和初始化程序有什么区别? [复制] 【发布时间】:2011-09-02 02:31:32 【问题描述】:

可能重复:Python (and Python C API): new versus init

我刚刚上大学,讲师交替使用构造函数和初始化程序这两个术语。我很确定这是错误的。

我尝试在谷歌上搜索答案,但没有找到我正在寻找的答案。

【问题讨论】:

我认为有人在关闭时错过了“完全重复”按钮,而是点击“离题”....:) 【参考方案1】:

在大多数 OO 语言中,它们是相同的步骤,所以他对 java、c++ 等的东西没有错。在 python 中,它们分两步完成:__new__ 是构造函数; __init__ 是初始化器。

Here 是另一个更详细地了解它们之间差异的答案。

【讨论】:

我见过的关于这个主题的最佳答案。【参考方案2】:

在几乎所有常见的情况下,Python 没有其他 OO 语言所使用的构造函数,因为通常不鼓励手动管理内存。相反,您通常应该做的是在类上定义一个 __init__ 方法。调用此方法以自动初始化新的实例对象,这是构造后的第一件事。因此,它并不是真正的构造函数,并且将其作为构造函数来谈论它可能会使某些人感到困惑。

当然,有些人想称它为构造函数,因为它的使用有点像构造函数 - 基本上,只要每个人都理解你实际指的是什么,你就可以随意调用它。但总的来说,为了明确并让自己理解,将其称为 init 方法或构造函数以外的其他东西。从根本上说,不同的语言只是有一些不同的术语,而且说得非常清楚总是需要根据你的主题和听众进行调整。

在 Python 中,可以以更精细的粒度管理实例的创建和销毁,但除非您知道自己在做什么,否则您不会想要这样做。这是通过定义 __new____del__ 方法来挂钩对象实例化和 del 语句来完成的。这些是否完全符合构造函数和析构函数的条件还有待商榷(Python 文档将 del 方法称为析构函数,但对于构​​造函数的构成往往含糊不清,例如,包括许多返回对象实例的函数)。我仍然鼓励您使用手头语言的特定术语,并在比较讨论中预先定义您的术语。与往常一样,您在演讲时对术语的选择涉及在听众能够轻松跟随您和可能导致听众混淆之间的权衡:如果您谈论的是内存管理,可能会尽可能具体,但如果您谈论的是松散的,那么只需使用您的听众理解的一些词并准备好澄清。

你的老师最不清楚,我不知道这些术语的任何一个规范定义,但它们可能会让那些从其他语言学习非常具体的定义的人感到困惑。

【讨论】:

【参考方案3】:

http://docs.python.org/reference/datamodel.html#basic-customization

__new__ - 构造函数。

__init__ - 初始化器。

【讨论】:

-1 您链接到的那个页面将__init__ 描述为构造函数,同时引用__init____new__ 接收传递给构造函数表达式的参数.它没有提到“初始化器”这个词。

以上是关于C#里类型初始化器和构造方法有啥区别 他们分别在啥情况下用?的主要内容,如果未能解决你的问题,请参考以下文章

在C#中for循环和foreach循环有啥区别?

java中构造方法和方法有啥区别

C#里事件和委托有啥区别啊??

在C#中long与int64有啥区别吗

pc上cmd里添加的静态路由保存在啥设备的啥位置,和直接在路由器里添加静态路由有啥区别?

Java的静态块和初始化块分别何时执行?有啥区别?