VideMedlem sedan dec. 19998 577 inlägg Hur skiljer jag på två lokala variabler, en som är medlem av klassen och en som är medlem i en metod, båda variablerna har samma namn.
Jag säger inte jag tänker göra så, det verkar lite som ett programmatiskt feltänk, men det skulle vara kul att veta. :)
Engine^Medlem sedan dec. 20003 887 inlägg Du kan inte deklarera en variabel två gånger...
Men rent programmeringstekniskt sett så skulle "scope-regeln" gälla och med andra ord blir variabeln i din metod ogiltig / redundant, eftersom klassvariabeln är högre upp i hierarkin så att säga.
VideMedlem sedan dec. 19998 577 inlägg Hmm... jag har fått det förklarat för mig hur man gör en gång, så det borde rimligtvis fungera, om dom nu inte har ändra i senare .NET.
nikoMedlem sedan juni 20022 599 inlägg Det är helt språkspecifikt.
C#:
public class MinKlass
{
private int minInt;
private void MinFunktion()
{
int minInt;
minInt=1; //Lokal variabel.
this.minInt=1; //Medlemsvariabel
}
}
I VB.NET heter this Me och i andra språk kan det heta andra saker.
För övrigt är din fråga inte alls webbrelaterad och borde postats i .NET, faktiskt.
VideMedlem sedan dec. 19998 577 inlägg niko, precis vad jag letade efter. Tack! :)
För övrigt är din fråga inte alls webbrelaterad och borde postats i .NET, faktiskt.
Vilket du har helt rätt i, bara för renholm att flytta tråden. ;)
QimenMedlem sedan juni 20015 009 inlägg Liten fråga, minInt som deklareras i Minfunktion() hör den ihop med Lokal variabel och den andra minInt med Medlemsvariabel? :)
niko skrev:
Det är helt språkspecifikt.
C#:
public class MinKlass
{
private int minInt;
private void MinFunktion()
{
int minInt;
minInt=1; //Lokal variabel.
this.MintInt=1; //Medlemsvariabel
}
}
Engine^Medlem sedan dec. 20003 887 inlägg
Quimen skrev:
Liten fråga, minInt som deklareras i Minfunktion() hör den ihop med Lokal variabel och den andra minInt med Medlemsvariabel?
minInt, som deklareras i MinFunktion hör till MinFunktion() och existerar inte utanför den, om det är så du menar.
Jag vill däremot påstå att det är väldigt "fult" att skriva så som niko gav exempel på. Jag har även en smula svårt att acceptera att man får göra så för kompilatorn, men det är jag det ;)
niko skrev:
Det är helt språkspecifikt.
Är det inte så att det är "objektspecifikt", programmeringsspråket har väl inget med det hela att göra (ok, alla språk vet inte vad objektorienterat är)?
nikoMedlem sedan juni 20022 599 inlägg
Engine^ skrev:
Jag vill däremot påstå att det är väldigt "fult" att skriva så som niko gav exempel på.
Fult? Nähä. I många sammanhang är det ju mer eller mindre standard:
public class Person
{
private int ålder;
public Person(int ålder)
{
this.ålder = ålder;
}
}
Mycket praktiskt att slippa hitta på olika namn på två variabler som egentligen syftar på exakt samma sak. (Så gör man även i Java jämt och ständigt.)
Engine^ skrev:
Är det inte så att det är "objektspecifikt", programmeringsspråket har väl inget med det hela att göra
Jo, men jag menade att namnet på objektreferensen (this) är godtycklig (och språkspecifik). Det heter ju faktiskt också olika i C# och VB.NET.
Engine^Medlem sedan dec. 20003 887 inlägg
niko skrev:
Fult? Nähä. I många sammanhang är det ju mer eller mindre standard
Mja... jag vill inte hålla med om att det är samma sak. Du menar att så gör man när klasskonstruktorn blir anropad och det är jag helt med på. Att man däremot har en metod i klassen som innehåller en variabel med samma namn som en av klassvariablerna är jag däremot inte med på... även om det kan fungera så.
niko skrev:
Jo, men jag menade att namnet på objektreferensen (this) är godtycklig (och språkspecifik). Det heter ju faktiskt också olika i C# och VB.NET.
Sanning... jag bara tänkte annorlunda.
SPiNMedlem sedan mars 20007 896 inlägg Exempel 1:
public class MyClass {
private int age;
public void setAge(int age) {
this.age=age;
}
}
Exempel 2:
public class MyClass {
private int age;
public void setAge() {
int age = 20;
this.age = age;
}
}
Det är skillnad på dessa två. Man behöver inte skicka med en parameter endast när konstruktorn anropas med samma namn, utan det är väldigt förekommande att man med vanliga setter- och gettermetoder ( Som man bör undvika, men ändå ;) ) används som i exempel 1. Exempel 2 ser man mycket sällan, och det håller jag också med om att det kan vara fult. Skillnaden är ju inte sådär jätteenorm, i båda fallen är this.age en instansvariabel och age är en lokal variabel för setAge(), men i exempel 1 finns den med som parameter till metoden.
En klassvariabel är en annan sak, det är en statisk variabel. :)
Engine^Medlem sedan dec. 20003 887 inlägg Humm... jag tar och dementerar mina tidigare inlägg och hänvisar till ett skumt tillstånd av seklariserat nirvana.
Hursomhelst börjar jag känna mig förvirrad... troligtvis p.g.a. min programmeringsstil. Normalt brukar jag använda något i stil med
public class c_Tjoho
{
private int m_intNothing;
public void c_Tjoho()
{
m_intNothing = 0;
}
public void SetNothing()
{
m_intNothing = 1;
}
}
och därför känns det för mig väldigt knepigt att i samma klass använda sig utav
public void SetItSpecially()
{
int m_intNothing; [blue]// <--- något jag aldrig skulle göra...[/blue]
this.m_intNothing = 2;
m_intNothing = this.m_intNothing; [blue]// <--- känns helt galet...[/blue]
}
this i det här fallet skickar genast mina tankar till klassens medlemsvariabler och inte funktionens och det är väl där jag tänker fel?
SPiNMedlem sedan mars 20007 896 inlägg Nu vet jag inte om jag förstått dig rätt, men det verkar som att du förstod mig eller niko fel. :)
this refererar som du säger till den egna objektreferensen, och inte till någon variabel i ett lokalt scope ( Metod, block, osv. ).
Exempelklass:
public class MyClass {
private int age;
public void setAge( int age ) {
/* Följande tilldelning sätter ju instansvariabeln 'age' ( [i]this.age[/i] )
till det värde som parametern 'age' har - vilket är ett snyggt och vanligt sätt */
this.age = age;
}
public void setAge() {
/* Följande tilldelning är ful, och skapar först en lokal variabel för metoden
'setAge()' och tilldelar denna ett värde ( 20 ) */
int age = 20;
/* Följande tilldelning ger då alltså instansvariabeln 'age' ( [i]this.age[/i] ) värdet av den
metod-lokala variabeln 'age', i det här fallet 20 */
this.age = age;
}
}
Anrop:
MyClass my = new MyClass();
/* MyClass's privata instansvariabel 'age'
kommer att ha värdet 25 efter följande metodanrop */
my.setAge(25);
/* MyClass's privata instansvariabel 'age'
kommer att ha värdet 20 efter följande metodanrop */
my.setAge();
Vad jag menar är att metoden 'setAge( int )' används frekvent och är ett bra sätt. Man slipper som niko säger komma på nya, skumma namn för sina variabler. Metoden 'setAge()' skapar en egen lokal variabel med värdet 20, för att efter det sätta instansvariabeln 'age' ( this.age ) till värdet av den lokala variabeln. Fult, och används inte alls mycket av vad jag har sett.
Jag är inte så pedagogisk, men det verkar som att ett missförstånd har uppenbarat sig i den här tråden. :)
Hänger du med på hur jag menar?
Engine^Medlem sedan dec. 20003 887 inlägg Jag tror att jag är med på hur du menar... det jag inte verkar ha insett är att referensen för this "överförs" till setAge() när det används i klassmetoden. Detta känns så grundläggande att jag inte kan begripa varför jag misstror användandet av this på det sätt som du och niko beskriver.
En annan anledning till det hela kan vara att mitt huvud börjar bli trött...
SPiNMedlem sedan mars 20007 896 inlägg
det jag inte verkar ha insett är att referensen för this "överförs" till setAge() när det används i klassmetoden.
Det är det den inte gör! Du har ju rätt! Det är det jag försöker visa, men jag är så opedagogisk att det kanske inte går att förtälja från mina inlägg. this refererar alltid till instansvariabler eller klassmetoder. Aldrig till lokala variabler. :)
Engine^Medlem sedan dec. 20003 887 inlägg Då tänkte jag ju rätt från början.
Jag måste ha fått hjärnsläpp någonstans i den här tråden... :)
Jag är ej heller någon lärare, men jag lär mig gladeligen ;)