Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Problem med referensparametrar!!!

Postades av 2003-06-12 23:03:08 - Henke Larsson, i forum c# (c-sharp), Tråden har 3 Kommentarer och lästs av 1411 personer

Tjena har ett program som tar en skärmbild och skickar sedan den till olika funktioner i andra classer för att undersökas där. Skulle nu vilja använda referensparametrar ist. för värdeparametrar eftersom jag inte ändrar något i bilden och jag tror det blir snabbare då bilden är ganska stor och tar mycket minnesutrymme.
Blir det snabbare med referensparameter?
Varför får jag följande fel?

Denna kod finns i min start class

<code>
Game myGame = new Game();
myGame.MyTurn(activeWindow);
</code>

Detta finns i classen Game
<code>
public int[] MyTurn(ref Bitmap activeWindow)
{
//Något sker
}
</code>

Följande felmeddelande kommer upp:
The best overloaded method match for 'PlayerModeling.Game.MyTurn(ref System.Drawing.Bitmap)' has some invalid arguments
Argument '1': cannot convert from 'System.Drawing.Bitmap' to 'ref System.Drawing.Bitmap'

Kan någon hjälpa mig??

MVH Henrik L



Svara

Sv: Problem med referensparametrar!!!

Postades av 2003-06-12 23:35:02 - Per Hultqvist

När man använder referensparametrar så måste man ange keywordet ref både vid anropet och i procedurdeklarationen. Ändra alltså till :

<code>
Game myGame = new Game();
myGame.MyTurn(ref activeWindow); // <- Lagt till ref
</code>

Finns väl både för och nackdelar med den lösning som man valt i C#; det blir ju tydligare när man använder ref, men samtidigt får man ju skriva ett extra keyword.


Svara

Sv: Problem med referensparametrar!!!

Postades av 2003-06-13 08:56:38 - Göran Persson

Tackar. Kommer det bli något snabbare nu när det inte behöver tilldelas något extra minne varje gång som funktionerna anropas. Tycker det måste vara mycket smidigare med ref.

Henrik L


Svara

Sv: Problem med referensparametrar!!!

Postades av 2003-06-13 09:50:56 - Patrik Löwendahl

Det kommer inte att bli snabbare.

Vare sig du tilldelar med ref eller inte, kommer metod variablen att peka på samma objekt på heapen som parametern du skickar in.

Det finns nämligen 2 nivåer av interakation vid variabel hantering av referens typer i .NET.

När du initierar en variabel;
<code>
Bitmap myWindow;
</code>

så skapar du plats på den lokala stacken. Det är på stacken alla variabler finns. Du har ännu inte skapat ngn instans av klassen du deklarerat utan bara markerat en plats på stacken för att lagra en _adress_ till det objektet du vill åt.

När du sedan skapar objektet:
<code>
myWindow = new Bitmap;
</code>

Så allokerar du minne på heapen för att lagra ditt objekt, skapar en instans av klassen och sedan får stackvariabeln tilldelat sig adressen till objektet på heapen.

Det innebär att det nu information om objektet på två platser, det ena är på stacken vilket innehåller variabeln och en adress som pekar på objektet. Det andra är heapen där själva objektet finns.

Ok, så då har vi rett ut det, men vad har det med ref att göra?

Jo följande,

när vi skickar parametrar in till en metod by value:
<code>
int myX = 3;
Bitmap myB = new Bitmap();
this.MyFunction(myX, myB);
.
.
.
private void MyFunction(int x, Bitmap b) {}
</code>
så skapar vi en kopia av _variabeln_. Det innebär för x som är en value type, att vi faktiskt får en kopia av värdet 3. Men för Bitmapen (b) får vi en kopia av adressen till objektet som ligger på heapen. Det innebär att för valuetypes, så har du vid by val, inte en referens till det inskickade värdet, men för referens types har du, du har två stycken referenser till samma objekt på heapen.

Så det är fullt legalt att göra ändringar inuti min metod MyFunction på bitmapen och det kommer att reflekteras överallt där variabler refererar till samma objekt på heapen. Vad du däremot inte kan göra är att ändra det stack värdet som myX och myB innehåller, dvs du kan inte ändra myX värde från 3 och du kan inte tvinga myB att peka på något nytt objekt på heapen.

<code>
int myX = 3;
Bitmap myB = new Bitmap();
this.MyFunction(myX, myB);
.
.
.
private void MyFunction(int x, Bitmap b) {

x++; // Kommer bara att synas för x, inte för myX

b.someParameter = someValue // Kommer att reflekteras på myB

b = new Bitmap() // kommer bara att gälla för b, inte för myB
}
</code>


Vad gör då ref för en referensvariabel? Jo du får ju en referens till variabeln på stacken, det innebär att för myB så får du en referens till adressen till objektet på heapen.

<code>
int myX = 3;
Bitmap myB = new Bitmap();
this.MyFunction(ref myX, ref myB);
.
.
.
private void MyFunction(ref int x, ref Bitmap b) {

x++; // Kommer att räkna upp både x och myX;

b.someParameter = someValue // Kommer att reflekteras på myB och b

b = new Bitmap() // kommer att peka om myB från den initiala bilden till en helt
// ny bild;
}
</code>


Så slutsatsen är att det enda du kan kontrollera vid metodanrop för parameterar av reference type, är hurvida adressen till objektet sok skickas in, kan ändras eller inte. Du får alltid tag på samma objekt, innanför och utanför metoden.


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 155
27 952
271 704
670
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies