Lägga till get set metod i class

Permalänk
Medlem

Lägga till get set metod i class

Hej,
Antagligen dum fråga detta men jag försöker lägga till en extra get set-metod i en class, men då vill det inte fungera.
Klassen är uppbyggd på följande sätt;

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization; using System.Web.Script.Serialization; namespace a { [Serializable] public class A { public A() { } public string metod1{ get; set; } public string metod2{ get; set; } public string metod3{ get; set; } public string metod4{ get; set; } public string metod5{ get; set; } } }

Varför vill det inte fungera när jag lägger till ytterligare en metod?

Permalänk
Medlem

Det hjälper att skriva vilket språk det rör sig om, tips är att sätta [C#] i topic t.ex
Skriv gärna kod innanför [.code] [./code] taggar (utan punkten) för att få med indentering.

Det verkar råda en viss förvirring då det du kallar metod1-5 är properties av typen string.
Men menar du att koden du klistrat in fungerar men lägger du till en

public string metod6{ get; set; }

så fungerar det inte?

Permalänk
Medlem
Skrivet av Xerbee:

Det hjälper att skriva vilket språk det rör sig om, tips är att sätta [C#] i topic t.ex
Skriv gärna kod innanför [.code] [./code] taggar (utan punkten) för att få med indentering.

Det verkar råda en viss förvirring då det du kallar metod1-5 är variabler av typen string.
Men menar du att koden du klistrat in fungerar men lägger du till en

public string metod6{ get; set; }

så fungerar det inte?

Ursäkta! Det rör sig om C#.

Nä det fungerar inte, funderar på om det kan ha att göra med att Serializable används?

Jag har alltså inte gjort koden från grunden utan metod 1-5 fanns från början och jag skulle behöva lägga till ytterligare en metod.

Permalänk
Medlem
Skrivet av ande85:

Ursäkta! Det rör sig om C#.

Nä det fungerar inte, funderar på om det kan ha att göra med att Serializable används?

Jag har alltså inte gjort koden från grunden utan metod 1-5 fanns från början och jag skulle behöva lägga till ytterligare en metod.

Lägg till en metod då? Du har bara en konstruktor men inga metoder.

public int GetRandom() {return 3;}

Här kan du se ett exempel på properties och metoder.
http://msdn.microsoft.com/en-us/library/bb384054.aspx

Permalänk
Hedersmedlem
Skrivet av ande85:

Nä det fungerar inte, funderar på om det kan ha att göra med att Serializable används?

Serializable bör inte påverka. Vad är det som inte fungerar? Felmeddelanden?

Permalänk
Medlem

Verkar inte vara fel på den klassen utan andra faktorer som påverkar...Jobbar mot en webservice och tror att den kanske kan påverka i detta fallet...tack för ert bidragande ändå!

Permalänk
Inaktiv

Det är inte metoder du har där utan properties. Ska du lägga till en riktig metod ska den ligga utanför konstruktorn:

public class Test { public Test() { //Konstruktorn } public int Method(int x, int y) { //Metod return x + y; } }

Skickades från m.sweclockers.com

Permalänk
Skrivet av anon150287:

Det är inte metoder du har där utan properties. Ska du lägga till en riktig metod ska den ligga utanför konstruktorn:

public class Test { public Test() { //Konstruktorn } public int Method(int x, int y) { //Metod return x + y; } }

Skickades från m.sweclockers.com

Det är ju så koden i originalposten ligger, eller?

public class A { public A() { }<- Kolla här, konstruktorn är tom! public string metod1{ get; set; } public string metod2{ get; set; }

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Inaktiv
Skrivet av morphman86:

Det är ju så koden i originalposten ligger, eller?

public class A { public A() { }<- Kolla här, konstruktorn är tom! public string metod1{ get; set; } public string metod2{ get; set; }

Hmm, ja du har helt rätt, jag som såg fel
Är dock fortfarande viktigt o skilja på metoder och properties.

Permalänk
Hedersmedlem
Skrivet av anon150287:

Är dock fortfarande viktigt o skilja på metoder och properties.

Tja, det

public string metod1{ get; set; }

gör är väl egentligen att skapa metoderna get_metod1() och set_metod1(string) (som dock inte kan anropas direkt).

Permalänk
Medlem

Det är inte att rekommendera att använda properties när man skall komma åt data som inte hanteras i programmet tex kopplingar mot databas, server, nätverksåtkomst etc. Saker som lätt kan genera exceptions så är det bättre att använda metoder.

Visa signatur

PC1: Sabertooth X58, i7 980, 24GB RAM, 2st GTX 470, Intel 330 180GB SSD, Corsair AX850.

Permalänk
Medlem
Skrivet av anon150287:

Hmm, ja du har helt rätt, jag som såg fel
Är dock fortfarande viktigt o skilja på metoder och properties.

Metoder och attribut menar du väl? Attributen innehåller sedan vissa värden (properties) för objektet.

Jag ser fyra möjliga lösningar på detta:
1) Använda get/set direkt (string attr { get; set; }, arbetar som ett publikt attribut då)
2) Använda get/set som metod (set ex. 2).
3) Använda get som metod (se ex. 3), och set som metod (se ex. 4).
4) Separera till två olika metoder som Elgot skrev.

Ex. 2

public string method1 { get { return attribute1; } set { if (value ... blablabla, lokik osv) attribute1 += value; } }

Ex. 3

public string get_method1 { get { return attribute1; } }

Ex. 4

public string set_method1 { set { if (value ... blablabla, lokik osv) attribute1 += value; } }

Jag vet inte med er. Men get/set ger renare kod ibland än vad man skulle få av en metod. Och det finns en logisk anledning varför Microsoft lade till detta i C#.
Att använda get/set, ger programmeraren möjligheten att fortfarande ha kontroll över vad som läses/skrives från/till attributet.
Så get/set fungerar fortfarande som metoder och hindrar andra objekt från att göra felaktiga modifieringar av attributet.

Ta det såhär, vilket är snyggast att kalla, och ger minst kod som det kan bli fel med:

nåttX = objektet.get_X(); nåttX = objektet.X; objektet.set_X("nytt värde"); objektet.X = "nytt värde";

objektet.X och objektet.X = "...", är fortfarande metoder som kallas (som kapslar in) och kan validera datan. Bara att det är ett nytt sätt att koda/designa det med.

Däremot i detta fallet, används get/set utan någon form av datavalidering, och blir då som att använda ett publikt attrubut. Men! Om programmerarna senare skulle besluta att lägga till validering, så kommer bara koden i denna klassen behöva justeras, och ingen annan stans.

Permalänk
Inaktiv
Skrivet av Elgot:

Tja, det

public string metod1{ get; set; }

gör är väl egentligen att skapa metoderna get_metod1() och set_metod1(string) (som dock inte kan anropas direkt).

Vet inte riktigt hur det fungerar "under the hood" men eftersom properties tex. inte kan ta emot argument (förutom value vid set) och inte räknas som metoder tycker jag det är viktigt att skilja dom åt.

Skrivet av NickoB:

Metoder och attribut menar du väl? Attributen innehåller sedan vissa värden (properties) för objektet.

Microsoft kallar dom properties, sen kan det ju finnas olika namn för dom.

Permalänk
Medlem
Skrivet av anon150287:

Vet inte riktigt hur det fungerar "under the hood" men eftersom properties tex. inte kan ta emot argument (förutom value vid set) och inte räknas som metoder tycker jag det är viktigt att skilja dom åt.

Microsoft kallar dom properties, sen kan det ju finnas olika namn för dom.

För att citera Microsoft om get/set property "special methods called accessors".

Det är ändå ett sätt som gör så man inte direkt kommer åt ett attribut i klassen, utan att behöva skapa en vanlig metod för det.
Vilket medför att attributet är inkapslat, och get/set metoden förblir en metod som kallas för att komma åt/modifiera attributet indirekt om man så vill.

Som jag skrev. Mindre kod att skriva (även om det bara är () som tas bort), vilket underlättar vid kodning/uppdateringar.
Man ska särskilja, så man inte har publika attribut i en klass. Men get/set metoderna underlättar ändå kodningen.