“if”陈述是否被认为是一种方法?
我的同行之间就“if”陈述是否被认为是一种方法进行了有趣的讨论? 尽pipe“if”附加了单词声明,但其行为仍类似于简单的非返回值方法。
例如:
if(myValue) //myValue is the parameter passed in { //Execute }
同样,一个方法可以执行相同的操作:
public void MyMethod(myValue) { switch(myValue) { case true: //Logic break; case false: //Logic break; } }
在编程语言中调用(考虑)“if”语句是一个简单的预定义方法是否准确?
在诸如C,C ++,C#,Java之类的语言中, IF
是作为保留字实现的语句 ,是语言核心的一部分。 在LISP家族的编程语言中(Scheme想到的) IF
是一个expression式 (意味着它返回一个值),并且被实现为一个特殊的forms。 另一方面,在像Smalltalk这样的纯面向对象的语言中, IF
实际上是一个方法(更准确地说: 消息 ),通常在Boolean
类或它的一个子类上实现。
底线:条件指令IF
的真正本质取决于编程语言以及该语言的编程范例。
不,“if”语句不像C#中的方法。 考虑它不像一种方法的方式:
- 包含块中的实体在“if”的范围内。 但是一个方法不能访问调用者的绑定环境。
- 在许多语言中,方法可能是某种东西的成员 – 一种types。 声明不是成员。
- 在具有一stream方法的语言中,方法可以作为数据传递。 (在C#中,通过将它们转换为委托。)“if”语句不是一stream的。
- 等等。 差异是无数的。
现在,将某些事情看作是一种方法,而不是“如果”陈述是有道理的。 许多运营商,例如,很像方法。 这两者之间的概念差异很小:
decimal x = y + z;
和
decimal x = Add(y, z);
事实上,如果你在C#中反汇编两位小数,你会发现生成的代码实际上是一个方法调用。
一些操作员具有不寻常的特征,使得难以将其描述为方法:
bool x = Y() && Z();
不同于
bool x = And(Y(),Z());
用一种对方法论点进行热切评估的语言; 在第一个中,如果Y()是假的,则Z()不被评估。 在第二个,都评估。
你创造一个“如果”的方法,而不是回避这个问题; 这个实现比“if”声明更复杂 。 说你可以用开关来模仿“如果”,就像说你可以用摩托车来模仿自行车; 用一些更复杂的东西代替简单的事情并不令人信服。 指出转换实际上是一个幻想“如果”是更合理的。
您不能创build一个myIfStatement()
方法,并期望以下工作:
... myIfStatement(something == somethingElse) { // execute if equal } else { // execute if different }
if
是控制语句,并且不能被方法复制,也不能用ifreplace方法调用:
myVariable = if(something == somethingElse);
if
不能重载。
这些是一些迹象, if
不是一种方法,但也有其他的我怀疑。
取决于语言,但在C,Java,Perl,不,它们是语言命令。 保留字。 如果他们是function,你可以重载他们,并指向他们,做所有其他的事情,你可以做的function。
尽pipe如此,这更像是一个哲学问题而不是一个编程问题。
一个方法有一个签名,其主要意图是可重用的逻辑,而如果只是一个条件,控制执行的stream程。 如果你了解assembly,你就会知道,即使是在很低的水平上,两者都是不同的。
你当然可以写If()
和IfElse()
方法,但不会使它们相同。
if()
被定义为语言中的语句,与方法调用的级别相同。 但是在语法和优化可能性方面存在差异。
所以:不, if()
语句不是一个方法 。 你不能把它分配给委托。
考虑到if
语句是一种方法,在我看来,这只会令人困惑。 与方法调用的相似之处仅仅是肤浅的。
if
语句是控制执行stream程的语句之一。 当它被编译成本地机器码时,它将评估expression式并进行条件跳转。
伪代码:
load myValue, reg0 test reg0 jumpeq .skip ; code inside the if .skip:
如果你使用else
,你会得到两个跳转:
load myValue, reg0 test reg0 jumpeq .else ; code inside the if jmp .done .else: ; code inside the else .done:
“if”陈述是否被认为是一种方法?
不,它不被认为是你可能已经在其他答案中看到的方法。 但是,如果你的问题是“它的行为像一个方法吗?”,那么根据所讨论的语言,答案可能是 肯定的 。 任何支持一streamfunction的语言都可以在没有像if
这样的构build/语句的if
。 忽略所有蓬松的东西,如返回值和语法,基本上它只是一个函数,评估一个布尔值, 如果它是true
,那么它执行一些代码块。 还要忽略OO和function上的差异,因为下面的例子可以作为Boolean
类的一个方法实现,不pipe使用哪种语言,就像Smalltalk一样。
Ruby支持可执行代码块,可以存储在一个variables中,并传递给方法。 所以这是一个在Ruby中实现的自定义_if_
函数。 { .. }
是传递给函数的一段可执行代码。 它也被称为Ruby中的块。
def _if_ (condition) condition && yield end # simple statement _if_ (42 > 0) { print "42 is indeed greater than 0" } # complicated statement _if_ (2 + 3 == 5) { _if_ (3 + 5 == 8) { puts "3 + 5 is 8" } _if_ (5 + 8 == 13) { puts "5 + 8 is 13" } }
我们可以在C,C ++,Objective-C,JavaScript,Python,LISP和许多其他语言中做同样的事情。 这是一个JavaScript示例。
function _if_(condition, code) { condition && code(); } _if_(42 > 0, function() { console.log("Yes!"); });
如果将它归类为一种方法,那么当然我们会在面向对象的领域,但是我们不是,所以我认为我们正在讨论一个函数。 当然可以写一个函数/子程序来复制if行为(我认为它实际上是lisp / scheme中的一个函数)。
我不会把它作为一个函数,甚至是一个子程序,只是控制stream量。
如果通过方法,我们理解了一个可以被调用的代码块,当方法结束时,控制stream自动返回给调用者,那么if
s不是方法。 在执行if
后控制stream程不会返回任何地方。
IF语句是在大多数语言中使用的条件构造特征,它从布尔条件评估的true或false执行pathstream。 除了分支预测的情况之外,这总是通过根据某些条件select性地改变控制stream来实现的。
IF构造是编程时使用的最基本和最需要的逻辑。 它允许构build模块来引入function。
是的 , if
是某种语言的function,即使这种function很less,而且用途有限。
通常情况下,这个结构就像if(booleanCondition, functionPointerToCallIfConditionTrue, functionPointerToCallIfCondtionFalse)
。如果需要的话,它本身可以用作其他函数的if(booleanCondition, functionPointerToCallIfConditionTrue, functionPointerToCallIfCondtionFalse)
。
举例来说,Mathematica的行为就是这样,如果你使用Linqexpression式的话, 即使C#也可以做一些工作。 看看System.Linq.Expressions.Expression.IfThenElse
。
不,如果你完成了,你不会回来。 这只是一个控制语句。
请注意,在你的例子中,你用另一个switch语句(8.7.2节)replace了一个“select语句”(C#4规范,第8.7节), if语句(第8.7.1节)。 您还将select语句重构为单独的方法。 但是,您还没有用方法replaceselect语句。
你的问题的答案是“不”。