问题

C#为什么非要把函数叫方法?

回答
哈哈,你这个问题问得特别好!咱们抛开那些一本正经的官方术语,来聊聊C里为什么把“函数”都叫做“方法”,感觉就像给咱自己的孩子起了个小名儿一样,有它的道理,也有点儿小习惯。

首先,咱们得明白,编程语言设计者们,他们也不是凭空拍脑袋决定叫啥的,这背后往往是有他们的设计哲学和对事物本质的理解。C的设计很大程度上受到了面向对象编程(OOP)思想的深刻影响,而“方法”这个词,恰恰是跟OOP紧密相连的。

想象一下,你手里有一个具体的东西(对象)

在面向对象的世界里,一切都是围绕着“对象”来的。一个对象,比如一只猫,它有什么?它有属性(颜色、名字、年龄)和行为(叫、跑、睡)。这个“行为”是什么?不就是我们平时说的“函数”干的事情吗?

所以,当C的设计者们说“方法”的时候,他们心里想的更多的是:

1. “这个功能是属于某个具体的东西(对象)的。”
比如,你有一只猫对象 `myCat`。你不能直接说“叫()”,因为谁来叫?是哪只猫在叫?你需要说 `myCat.Meow()`。这个 `Meow()` 就是一个方法,它依附于 `myCat` 这个对象而存在,是 `myCat` 这个对象能做的某件事。
再比如,一个计算器对象 `calculator`,它能做加法运算 `Add(a, b)`。这个 `Add` 就是 `calculator` 对象的方法,而不是一个孤立存在的函数。

2. “方法是对象的能力,而不是独立的功能。”
如果你是在写一个面向过程的程序,可能就会有个独立的函数 `CalculateSum(int a, int b)`。你可以直接调用它,不需要先创建一个“计算总和”的东西。
但在C里,即使是像`Console.WriteLine()`这样的,看似“独立”的功能,它实际上也是依附于`Console`这个类(可以理解为一种抽象的“东西”)的“静态方法”。它虽然不需要你显式创建一个`Console`对象,但它确实是属于`Console`这个“概念”里的一个行为。

“方法”比“函数”更能体现“封装”和“行为”

封装(Encapsulation): OOP的核心之一就是封装。把数据(属性)和操作数据的方法(行为)捆绑在一起,形成一个独立的单元(对象)。你调用一个对象的方法,就是通过这个对象来操作它内部的数据。
行为(Behavior): “方法”这个词本身就带有“行为”的含义,非常贴切地描述了对象所能做的动作。一个对象有多少能力,就看它有多少方法。

历史渊源和习惯的力量

C的设计很大程度上受到了Java和C++的影响。在Java里,一切(几乎)都发生在类里面,所以函数就自然被称为“方法”。C继承了这种思想,所以也沿用了“方法”这个称呼。这就像一种约定俗成,大家都这么叫,就约定俗成了。

打个比方,你可以把“函数”看作是一个数学上的概念,它接收输入,然后输出结果,不关心它是在哪儿实现的。而“方法”则更像是一个“技能卡”,这张卡是属于某个角色(对象)的,只有拿到这张卡的角色才能使用这个技能。

为什么我们要这么区分呢?

清晰地表达意图: 当你看到一个“方法”,你立刻就知道它与某个类或对象有关。这能帮助你更好地理解代码的结构和各个部分的关系。
面向对象设计的天然延伸: 如果你想用面向对象的方式写代码,那么拥抱“方法”这个概念就是自然而然的事情。
避免混淆: 虽然很多情况下“函数”和“方法”做的事情差不多,但严格区分可以避免在讨论面向对象设计时产生歧义。

所以,简单来说:

在C里,我们之所以更喜欢说“方法”,而不是“函数”,是因为C是一门强烈的面向对象语言。这个“方法”的称呼,强调了代码中的这些可执行部分是属于某个特定对象或类的,是对象的能力或者行为的体现。这比“函数”更能体现面向对象设计的精髓。

别看只是一个词的差别,它背后反映的是一套不同的编程思想和看待代码的方式。当你在C的世界里遨游时,习惯了“方法”这个称呼,你会发现它确实更能帮你抓住代码的脉络。

网友意见

user avatar

奇怪,这不是Java非这么叫么……


C#并不总是把函数叫做方法,譬如说C#里面函数的引用包装,叫委托(delegate),Java叫SAM(Single Abstract Method)。

常用的泛型委托就是Func<>,很明显这是Function的缩写而不是Method的缩写。

还有,C#的本地函数(Local Function),也叫做函数,而不叫做本地方法。

继续,Razor里面的工具函数块,也叫做函数@functions


综上所述,C#里面把函数叫函数的情况非常多,只有成员函数是跟Java学坏了……

user avatar

这不是C#特有的,而是面向对象里的概念。

方法是指对象能够进行的操作,方法同时还有另外一个名称,叫做函数。方法是类中的定义函数,其具体的作用就是对对象进行描述操作。

类似的话题

  • 回答
    哈哈,你这个问题问得特别好!咱们抛开那些一本正经的官方术语,来聊聊C里为什么把“函数”都叫做“方法”,感觉就像给咱自己的孩子起了个小名儿一样,有它的道理,也有点儿小习惯。首先,咱们得明白,编程语言设计者们,他们也不是凭空拍脑袋决定叫啥的,这背后往往是有他们的设计哲学和对事物本质的理解。C的设计很大程.............
  • 回答
    克里斯蒂亚诺·罗纳尔多在2018年离开皇家马德里,对于许多球迷来说确实是一个令人意外且有些遗憾的决定。关于他当时离开的原因以及是否想到过离开后会影响金球奖,我们可以从多个角度进行详细的分析:一、离开皇家马德里的直接原因:虽然外界有各种猜测,但C罗本人及媒体报道普遍认为,他离开皇马的主要导火索是税务问.............
  • 回答
    好,咱们来聊聊 C++ 单例模式里那个“为什么要实例化一个对象,而不是直接把所有成员都 `static`”的疑问。这确实是很多初学者都会纠结的地方,感觉直接用 `static` 更省事。但这里面涉及到 C++ 的一些核心概念和设计上的考量,咱们一点点掰开了说。 先明确一下单例模式的目标在深入“`st.............
  • 回答
    咱们今天就来聊聊C++里一个挺有意思的设计,叫做“虚表”。听着名字有点科技感是吧?其实它就是为了解决一个很核心的问题:怎么让多态在C++里跑起来?你可能已经知道,C++允许我们写一些基类,然后从它派生出很多不同的子类。比如,我们可以有一个“动物”基类,然后有“狗”、“猫”、“鸟”等等子类。每个子类都.............
  • 回答
    C++ 构造函数为何青睐初始化列表?那点不得不说的“前世今生”在 C++ 的世界里,构建一个对象就如同搭建一座精密的房子,而构造函数则是这房子的“奠基石”和“设计师”。它负责在对象诞生之初,为其成员变量赋予初始值,确保对象拥有一个合法且可用的状态。然而,在众多构造函数的设计手法中,初始化列表(Ini.............
  • 回答
    在 C++ 类设计中,`private` 关键字扮演着一个至关重要的角色,它不仅仅是“隐藏”数据那么简单,更是实现封装、保护数据完整性、维护类内部一致性以及提高代码可维护性和灵活性的基石。如果没有 `private`,面向对象编程的许多核心优势将荡然无存。我们来剥开 `private` 的层层面纱,.............
  • 回答
    C++ 中将内存划分为 堆(Heap) 和 栈(Stack) 是计算机科学中一个非常重要的概念,它关乎程序的内存管理、变量的生命周期、性能以及程序的灵活性。理解这两者的区别对于编写高效、健壮的 C++ 程序至关重要。下面我将详细阐述为什么需要将内存划分为堆和栈: 核心原因:不同的内存管理需求和生命周.............
  • 回答
    在 C/C++ 的开发世界里,你是否曾好奇过,为什么代码不像有些语言那样, all in one?为什么我们总是要劳神费力地去组织头文件(.h 或 .hpp)和源文件(.c 或 .cpp)?这背后可不是什么繁琐的规定,而是为了让我们的代码更清晰、更易于管理,并且能更有效地被计算机理解和执行。想象一下.............
  • 回答
    机械工程专业学习 C 语言,乍听起来可能有些“跨界”。毕竟,我们脑海中的机械工程,更多的是和金属、齿轮、发动机、力学打交道。然而,随着科技的飞速发展,尤其是制造业的智能化、自动化浪潮,编程语言,特别是 C 语言,已经不再是计算机科学的专属,而是成为了机械工程师手中一把不可或缺的利器。为什么机械工程需.............
  • 回答
    C 匿名类型属性被设计成只读,这背后有其深刻的理由,并非随意为之。理解这一点,需要我们深入挖掘匿名类型的本质和它在 C 语言中的定位。首先,我们得明白匿名类型是什么。它是一种在编译时创建的、没有显式声明的类型,其名称由编译器自动生成。你看到的“匿名”,指的就是你无法在代码中像定义普通类一样,通过 `.............
  • 回答
    你这个问题问得太好了,简直触及了音乐的灵魂!为什么作曲家们要玩转那些升降号,而不是老老实实地待在C大调这个“纯净”的乐土上呢?如果音乐世界里只有C大调,那得有多单调啊!想想看,C大调确实简单、好听,就像一杯白开水,纯净无暇。但你要是天天只喝白开水,会不会觉得日子过得有点寡淡?音乐也是一样的道理。作曲.............
  • 回答
    为何C/C++中字符和字符串要用引号包裹?在C/C++的世界里,我们经常会看到单引号 `' '` 包裹着一个字符,双引号 `""` 包裹着一串字符(也就是字符串)。这不仅仅是语言的规定,背后有着深刻的设计哲学和实际考量。今天我们就来好好掰扯掰扯,为啥它们需要这些“外衣”。 先聊聊字符(char)和它.............
  • 回答
    一谈到中国的高铁,很多人都会想到“和谐号”系列动车组,尤其是CRH380A/B/C等型号,它们代表了中国在高速铁路领域取得的辉煌成就,仿佛一切都是自主研发的巅峰之作。然而,当我们深入了解CRH380D这个型号时,会发现情况并非如此简单。CRH380D的出现,确实与加拿大庞巴迪公司有着千丝万缕的联系,.............
  • 回答
    在C++的世界里,“virtual”这个词被翻译成“虚函数”,这可不是随意为之,而是因为它精确地抓住了这种函数在继承和多态机制中的核心特征。理解“虚”这个字的关键,在于它暗示了一种“不确定性”,或者说是一种“在运行时才确定”的行为。设想一下,你有一系列动物,比如猫、狗,它们都属于一个更大的“动物”类.............
  • 回答
    咱们聊聊为啥用C++写视频播放器的时候,FFmpeg 简直就是个绕不开的“香饽饽”。这玩意儿可不是凭空来的,背后是实打实的硬功夫和解决实际问题的能力。想象一下,你要从零开始写个视频播放器。这听起来好像就是“读取文件,解码,然后显示”。简单吧?别天真了。视频这东西,水可深了。 视频的“乱”与“多样”:.............
  • 回答
    M43 相机之所以比 APSC 相机更贵,这背后其实涉及一系列的成本考量、市场定位以及技术取舍。简单来说,这并不是一个简单的“谁更好”的问题,而是“为什么成本结构和市场策略导致了这样的价格差异”。首先,我们需要明白 M43 和 APSC 各自的定位。 M43(Micro Four Thirds).............
  • 回答
    这背后的原因,其实挺有趣的,涉及到编程语言的历史演变、效率考量,以及开发者们多年来形成的习惯和偏好。简单来说,C++ 使用 `&&`、`||` 和 `!` 来表示逻辑运算,而不是 `and`、`or` 和 `not`,主要是为了历史兼容性、效率以及更简洁的语法。咱们就掰开了揉碎了聊聊。 1. C++.............
  • 回答
    梅西和C罗的球迷之间之所以会互相“黑”对方,这背后其实是一系列复杂因素交织的结果,与其说是一种简单的“仇恨”,不如说是一种由体育竞技、个人崇拜、社交媒体放大以及群体心理共同作用下的“爱之深责之切”式对抗。下面我将从几个方面详细道来,力求将这件事讲透彻,也希望你能从中看到一些人情味,而不是冰冷的机器分.............
  • 回答
    确实,在C中,闭包的实现比你初看时要复杂得多。这并不是因为它本身是一个多么“巨大”的概念,而是为了实现闭包所必须付出的底层代价。你可以把闭包想象成是一个“功能强大但需要额外包装”的工具。下面我们就来仔细拆解一下,为什么这个看起来简单的概念在C里会牵扯出这么多东西。首先,什么是闭包?最核心的定义是:闭.............
  • 回答
    你这个问题问得非常好,也触及到了很多吉他初学者学习初期的一个小困惑。简单来说,你说的“C调的大三和弦”其实就是指C大调的各个组成和弦,但并非所有和弦都是必须从C大调的组成和弦开始学。更何况,初学者最开始接触的这几个和弦(C、Dm、Em、F、G、Am)恰恰是这几个调性里非常核心、非常常用的几个和弦,而.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有