15

这是教授新人 ColdFusion 的最大障碍之一。

何时使用 # 充其量是模棱两可的。由于使用它们通常不会产生问题,因此大多数人似乎倾向于过度使用它们。

那么,基本规则是什么?

4

6 回答 6

13

我认为说在哪里不使用# 可能更容易。唯一的地方是在 cfif 语句和 cfset 语句中,您不使用变量来构建引号中的字符串。在几乎所有其他情况下,您都需要使用 # 符号。

您不打算使用它的示例:

<cfset value1 = 5>
<cfset value2 = value1/>

<cfif value1 EQ value2>
    Yay!!!
</cfif>

<cfset value2 = "Four plus one is " & value1/>

您将在哪里使用 # 的示例:

in a cfset where the variable is surrounded by quotes
<cfset value1 = 5>
<cfset value2 = "Four plus one is #value1#"/>

the bodies of cfoutput, cfmail, and cffunction (output="yes") tags
<cfoutput>#value2#</cfoutput>
<cfmail to="e@example.com" from="e@example.com" subject="x">#value2#</cfmail>
<cffunction name="func" output="yes">#value2#</cffunction>    

in an attribute value of any coldfusion tag
<cfset dsn = "myDB"/>
<cfquery name="qryUsers" datasource="#dsn#">

<cfset value1 = 5>
<cfset value2 = 10/>
<cfloop from="#value1#" to="#value2#" index="i">

<cfqueryparam value="#value1#" cfsqltype="cf_sql_integer"/>

编辑:

我刚刚注意到的一件奇怪的小事似乎不一致,条件循环允许变量名在有和没有 # 符号的情况下使用。

<cfset value1 = 5>

<cfloop condition = "value1 LTE 10">
    <cfoutput>#value1#</cfoutput><br>
    <cfset value1 += 1>
</cfloop>

<cfset value1 = 5>

<cfloop condition = "#value1# LTE 10">
    <cfoutput>#value1#</cfoutput><br>
    <cfset value1 += 1>
</cfloop>
于 2009-07-01T13:32:13.223 回答
7

以下是 Adob​​e 对此的评价:

使用数字符号

于 2009-07-01T12:42:46.427 回答
5

字符串插值:

<cfset name = "Danny" />
<cfset greeting = "Hello, #name#!" />
<!--- greeting is set to: "Hello, Danny!" --->

自动转义字符串插值cfquery

<cfset username = "dannyo'doule" ?>
<cfquery ...>
    select u.[ID]
    from [User] u
    where u.[Username] = '#username#'
</cfquery>
<!--- the query is sent to the server (auto-escaped) as: --->
<!--- select u.[ID] from [User] u where u.[Username] = 'dannyo''doule' --->
<!--- note that the single-quote in the username has been escaped --->
<!--- by cfquery before being sent to the database server --->

在 CFML 中传递复杂的参数/属性:

<cfset p = StructNew() />
<cfset p.firstName = "Danny" />
<cfset p.lastName = "Robinson" />
<cfmodule template="modules/view/person.cfm" person="#p#">
<!--- the variable Attributes.person will be --->
<!--- available in modules/view/person.cfm --->

传递复杂的参数#只需要 CFML 中的符号,而不需要 CFScript。此外,您可以传递任何类型的值:简单值、数组、结构、cfcomponents、cffunctions、java 对象、com 对象等。

#在所有这些情况下,符号之间的文本不必是变量的名称。事实上,它可以用任何表达方式。当然,对于字符串插值,表达式必须计算为一个简单值,但对于在 CFML 中传递的参数/属性,表达式也可以计算为任何复杂值。

于 2009-07-01T15:16:16.163 回答
3

#...#语法允许您在字符串文字中嵌入表达式。不幸的是,ColdFusion 对于什么是字符串和什么是表达式非常不一致。Jayson 提供了一个很好的示例列表,说明何时使用(或不使用)#s。

于 2009-07-01T11:59:12.617 回答
1

冒着听起来像个聪明人的风险,一个经验法则是:只有在这样做不会产生正确结果时才在变量或表达式周围使用#。或者:如果您不需要它们,请不要使用它们。

不过,我喜欢杰森的回答。

于 2009-07-04T02:48:52.307 回答
0

让我们首先假设您不是在谈论 cfoutput 标签,因为答案总是在代码的其他地方,如果您在引号内,则需要使用 # 符号,如果可以实际键入要输入的值要使用...因此,如果您在 cfloop 标记中设置“to”属性,则可以轻松键入 6,但如果要使用变量,则需要使用 # 符号。现在,如果您在设置查询参数的 cfloop 标记中,则无法在该属性中实际键入查询,无法键入查询,因此不需要 # 符号。

同样在 cfdump 标记中,您可以转储静态文本,因此如果您想转储变量的内容,则需要使用 # 符号。这个问题通常是自我纠正的,但我感觉到你的痛苦,你的学生可能对没有“总是使用它们”或“从不使用它们”的方法感到沮丧……遗憾的是,事实并非如此,唯一的事情是是真的,只有引号内的一种方式是正确的。因此,如果它不起作用,请仔细观察它并思考自己:“我可以输入该值而不是使用该变量中包含的值吗?” 如果答案是否定的,则不需要 # 符号,否则请打开 # 字符 foo。

于 2009-11-06T02:52:41.880 回答