---
title: "ByRef & ByVal för objekt"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/67140-byref-byval-för-objekt"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "Vide"
published: "2003-02-04T13:14:52.000Z"
updated: "2003-02-05T10:08:14.000Z"
replies: 12
views: 513
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/67140-byref-byval-för-objekt"
---

# ByRef & ByVal för objekt

## #1 — Vide, 2003-02-04T13:14Z

Tjena,

Nu till nästa fråga, jag skickar in ett recordset till en funktion där jag på något sätt påverkar recordsettet, kör jag ByVal så kopieras väl objektet till funktionen och de ändringar som genomförs är helt knutna till det kopierade objektet.

Jag vill använda ByRef så att allt jag ändrar slår igenom till objektet utanför komponenten. Men kör jag ByRef får jag ett felmeddelande om "Type mismatch", definitionen av funktionen:

```
Public Function GetRsInHTML([b]ByRef[/b] rsObject As ADODB.Recordset) As String
```

Kan någon berätta för mig vad som egentligen händer med objekt när man kör dom via ByRef?

Mvh, Vide

Permalänk: https://www.webforum.nu/p/67140

## #2 — niko, 2003-02-04T13:40Z

Om man överförenklar så kan man säga att ByVal=ByRef. Dvs *objekt* skickas alltid ByRef och ändringar slår igenom till objektet utanför komponenten även om du skriver ByVal.

De skillnader som finns beskrivs här: <http://vb.oreilly.com/ron/objects.html>.

Varför du får "Type mismatch" vet jag inte. Kommer det inte nånstans *inne* i funktionen? Hur ser koden ut när du anropar "GetRsInHTML"?

Permalänk: https://www.webforum.nu/p/940525

## #3 — Vide, 2003-02-04T14:07Z

Okej, så egentligen spelar det inge roll om du kör med objekt.

Type mismatch kommer när jag försöker att använda ByRef, kör jag ByVal så funkar allt prima...

Koden som anropas med ett recordset:

```
'Returns a HTML table representing the structure of a recordset.
Public Function GetRsInHTML(ByVal rsObject As ADODB.Recordset) As String

  Dim i As Integer
  Dim strHTMLTable As String

  If rsObject.EOF Then

    GetRsInHTML = "<b><font color='red'>The object is at EOF</font></b>"
    Exit Function

  End If

  rsObject.MoveFirst

  strHTMLTable = "<table border='1'><tr>"

  For i = 0 To rsObject.Fields.Count - 1
    strHTMLTable = strHTMLTable & "<td width='100' class='text'><b>" & rsObject.Fields(i).Name & "</b></td>"
  Next

  strHTMLTable = strHTMLTable & "</tr>"

  Do Until rsObject.EOF

    strHTMLTable = strHTMLTable & "<tr>"

    For i = 0 To rsObject.Fields.Count - 1
      strHTMLTable = strHTMLTable & "<td width='100' class='text'>&nbsp;" & rsObject.Fields(i).Value & "&nbsp;</td>"
    Next

    strHTMLTable = strHTMLTable & "</tr>"

    rsObject.MoveNext
  Loop

  strHTMLTable = strHTMLTable & "</table>"
  
  GetRsInHTML = strHTMLTable
  
  rsObject.MoveFirst

End Function
```

Permalänk: https://www.webforum.nu/p/940547

## #4 — @nders, 2003-02-04T14:12Z

Om du ska kasta in saker från en asp-sida till byref-parametrar *måste* den vara definierad som variant i interfacet. Du kan dock ha den definierad som variant och ändå skicka tillbaka ett recordset i den.

Mvh,

Permalänk: https://www.webforum.nu/p/940551

## #5 — Vide, 2003-02-04T14:43Z

Har jag fattat det rätt om jag skall göra såhär istället?

```
Public Function GetRsInHTML(ByRef rsObject As Variant) As String
```

Permalänk: https://www.webforum.nu/p/940572

## #6 — @nders, 2003-02-04T14:45Z

Japp.

Sedan skapar du ditt recordset som vanligt inne i funktionen och sätter din *rsObject = dittrecordsetsomduskapatifunktionen* i funktionen.

Mvh,

Permalänk: https://www.webforum.nu/p/940574

## #7 — Vide, 2003-02-04T14:50Z

Tack! :)

Men motsäger inte det lite av det som niko sa, att ByVal och ByRef nästan är samma sak när det gäller objekt?

Permalänk: https://www.webforum.nu/p/940579

## #8 — @nders, 2003-02-04T15:01Z

Nej, det tycker jag inte. Grejen är att ASP inte kan hantera annat än varianter i interface till COM-objekt, eftersom det i VBScript inte finns annat än varianter. Hade du istället kallat på denna metod från en annan klass eller komponent hade det varit helt andra bullar.

Mvh,

Permalänk: https://www.webforum.nu/p/940587

## #9 — Erik Juhlin, 2003-02-05T07:41Z

För det första så fungerar väl recordsets annorlunda jämfört med andra objekt. Där kopieras väl hela objektet..?

Sen så är väl skillnaden när man kör ByRef och ByVal att när man kör ByRef så kan man byta ut hela objektet mot ett annat och inte bara göra ändringar i det. :)

Permalänk: https://www.webforum.nu/p/941020

## #10 — Vide, 2003-02-05T08:19Z

Men om hela objektet kopieras så kommer väl det inte att bli en referens, eller speglar den tillbaks när funktionen är färdigkörd?

Permalänk: https://www.webforum.nu/p/941044

## #11 — niko, 2003-02-05T09:25Z

> **Erik Juhlin skrev:**
>
> För det första så fungerar väl recordsets annorlunda jämfört med andra objekt. Där kopieras väl hela objektet..?

Nej? Det faller ju delvis på sin egen orimlighet. Ett statiskt, client-side recordset skulle *möjligtvis* kunna kopieras byte för byte (även om det vore ineffektivt). Men hur skulle tex ett dynamiskt, server-side recordset kunna kopieras? Det finns ju inte i sin helhet på klienten. Får man en kopia av hela databasen då?

Oavsett om man skickar in ett recordset byval eller byref så kommer man att manipulera originalobjektet inne i funktionen.

> **Erik Juhlin skrev:**
>
> Sen så är väl skillnaden när man kör ByRef och ByVal att när man kör ByRef så kan man byta ut hela objektet mot ett annat och inte bara göra ändringar i det.

Den exakta skillnaden mellan byval och byref är att byval skickar in en kopia av *referensen*. Men en kopia av referensen och originalreferensen pekar fortfarande båda på originalobjektet.

Vad skillnaden innebär: <http://vb.oreilly.com/ron/objects.html>.

Om man sen tänker på MTS-objekt (som du kanske gör) så blir det lite överkurs, då tillkommer marshalling över process-boundaries och sånt.

Permalänk: https://www.webforum.nu/p/941085

## #12 — Erik Juhlin, 2003-02-05T09:42Z

Jo, så är det. Det måste vara ett client-side recordset. :)

Jo, men om man skickar en kopia på referensen och sen byter ut den så kommer inte originalobjektet vara utbytt. :)
Flummigt. :)

Permalänk: https://www.webforum.nu/p/941097

## #13 — niko, 2003-02-05T10:08Z

> **Erik Juhlin skrev:**
>
> Jo, men om man skickar en kopia på referensen och sen byter ut den så kommer inte originalobjektet vara utbytt.

Exakt! Det är en av skillnaderna som tas upp i artikeln jag länkade till.

Permalänk: https://www.webforum.nu/p/941137

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/67140-byref-byval-för-objekt
