webForumDet fria alternativet

Subrutiner och paranteser?!

ASP

7 svar · 313 visningar · startad av Troxy

Medlem sedan mars 20041 505 inlägg
Frågan#1

En sak jag är förvirrad över är hur det egentligen är med paranteser när man anropar subrutiner. Ska dom användas eller inte?!

Exempel:

Response.write("hello world")
Response.write "hello world"

Vad är skillnaden?

Jag har läst att man inte ska använda paranteser när man anropar subrutiner, utan bara för funktioner. Men jag tror bestämt jag har sett folk använda det ändå utan att få något felmeddelande. När jag använder paranteser för en subrutin så får jag felmeddelande.

Hur är det egentligen?

Medlem sedan juni 2004533 inlägg
#2

Rätt är:

Response.Write "hello world"

Ifall du sätter parenteser runt värdet så tolkas det inte som parenteser för anropet, utan just som parenteser runt värdet. Alltså:

Response.Write ("hello world")

Ifall man försöker anropa en subrutin med flera parametrar med parenteser så får du ett felmeddelande:

objConn.Execute(strSQL,,128) '<-- syntaxfel
Medlem sedan mars 20041 505 inlägg
#3

Tack så mycket :e

Okej, så det är när man ger en sub flera argument som paranteser strular till det. Jag anropar alltid subs utan paranteser, lika bra att forsätta så då :D

Medlem sedan juni 2004533 inlägg
#4

Parenteser kan strula till det även med en parameter. Att sätta parenteser runt en parameter i ett anrop innebär att värdet av parametern skickas istället för en referens.

Här innebär parentesen alltså att det är värdet av variabeln lngCnt som skickas istället för en referens till variabeln. Alltså kommer variabeln inte att ändras, och fortfarande innehålla ett när den skrivs ut.

Sub Increase(ByRef lngCounter)
   lngCounter = lngCounter + 1
End Sub

Dim lngCnt
lngCnt = 1
Increase(lngCnt)
Response.Write lngCnt
Medlem sedan mars 20002 836 inlägg
#5

fast, ska man ha parenteser runt en sub i ett anrop ska man anropa subben så här:

Call Subrutinen(vardet)

Tar vi Guffas exempel:

<%
Sub Increase(ByRef lngCounter)
   lngCounter = lngCounter + 1
End Sub

Dim lngCnt
lngCnt = 1

[b]Call[/b] Increase(lngCnt)

Response.Write lngCnt
%>

så får det utskrivna värdet 2, som sig bör ;-)

Klart "renare" och förklarande kod :o)

cya,
/PatrikB

Medlem sedan maj 200010 687 inlägg
#6

Jag tycker inte koden blir så mycket renare av 100 Call Response.Write("..."). Ser ganska äckligt ut. Gammal Basic kvarleva...
Subbar anropar man utan paranteser...

Medlem sedan dec. 20003 887 inlägg
#7

Om en funktion anropas med call kommer ett eventuellt returvärde att ignoreras.

Jag har iofs inte testat skriva

x = call theFunction()

men jag gissar att det inte fungerar.

Rätt enligt mig ;) är att om man anropar en metod till ett objekt ska det vara paranteser.
Anropar man en funktion eller sub ska det vara paranteser.
Anropar/läser man ett property till ett objekt ska det inte vara några paranteser.

Tack för idag, slut för idag. :)

Medlem sedan juni 2004533 inlägg
#8

Jag använder konsekvent Call när jag anropar egendefinierade subrutiner och metoder, och utan Call när jag anropar inbyggda subrutiner och metoder.

259 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
116 ms — ändringar (db)