---
title: "Stänga for each objekt"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/84170-stänga-for-each-objekt"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "Erik Juhlin"
published: "2003-08-13T11:53:19.000Z"
updated: "2003-08-14T10:10:15.000Z"
replies: 6
views: 267
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/84170-stänga-for-each-objekt"
---

# Stänga for each objekt

## #1 — Erik Juhlin, 2003-08-13T11:53Z

Behöver man stänga ett objekt man använder i en for each loop? Typ:

```
Dim rs As ADODB.Recordset, f As ADODB.Field

Set rs = ...

For Each f In rs.Fields
	MsgBox f.Name
Next f

Set rs = Nothing
```

Behöver man där lägga till Set f = Nothing på slutet?

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

## #2 — Poffe, 2003-08-13T11:59Z

Nej, det har jag aldrig hört talas om att man ska göra.

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

## #3 — Nexus86, 2003-08-13T14:59Z

Kan alltid vara bra att göra för att bruka mindre minne.

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

## #4 — Erik Juhlin, 2003-08-13T15:09Z

Behövs det eller stängs objektet automagiskt i.o.m. att loopen är klar? :)

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

## #5 — niko, 2003-08-13T15:35Z

> Behövs det eller stängs objektet automagiskt i.o.m. att loopen är klar?

Frågan är egentligen ganska förvirrande. f refererar till ett ADODB.Field inne i ett ADODB.Recordset (rs) och minnet det upptar kan inte avallokeras *innan* Recordsetet avallokeras. Det avallokeras istället *samtidigt* som recordsetet avallokeras

```
set f=nothing
```

blir alltså helt verkningslöst (men inte fel).

Förutom det, så är f som referens i vilket fall som helst ogiltig *efter* loopen.

Experiment:

```
Dim rs As ADODB.Recordset, f As ADODB.Field
Set rs = ...
For Each f In rs.Fields
	MsgBox f.Name
Next f
[blue]msgbox f is nothing[/blue]
Set rs = Nothing
```

Referensen nollas alltså av loopen själv.

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

## #6 — Erik Juhlin, 2003-08-14T06:12Z

Jo, provade det själv och fick också att f var Nothing efter loopen. Känns ganska logiskt också att f objektet endast finns inne i loopen.
Var min chef som helt plötsligt fått för sig att man behöver stänga såna objekt. :)

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

## #7 — niko, 2003-08-14T10:10Z

> Var min chef som helt plötsligt fått för sig att man behöver stänga såna objekt.

Nej, enumeratorfunktionen i fields-collectionen fixar det själv. Men i andra fall har nog din chef en poäng som inte riktigt framgår av mitt svammel ovan.

```
Dim rs As ADODB.Recordset, f As ADODB.Field
Set rs = ...

set f = rs.fields(0) 'Vi skapar en kopia av [i]referensen[/i] till första fältet i rs.
debug.print ObjPtr(f) = ObjPtr(rs.fields(0)) 'Ger true eftersom det är samma objekt och inte en klonad kopia.
Set rs = Nothing 'Vi nollar den enda referensen till recordsetet.
Debug.print f.Name 'Fungerar bra.
Debug.print rs.fields(0).Name 'Ger run-time error eftersom rs inte är en giltig referens.
set f = Nothing 'Vi nollar referensen till fältet.
```

Frågan som uppstår är alltså när recordsetet egentligen avallokeras i det här fallet? Utan att ha kollat närmare så är jag ganska säker på att det inte sker förrän f har nollats.

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

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/84170-stänga-for-each-objekt
