Verktyg Visningsval
2012-04-17, 10:20   #1

ande85

Medlem

Registrerad: jun 2004

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?
ande85 är inte uppkopplad
2012-04-17, 10:32   #2

Xerbee

Medlem

Xerbees avatar

Plats: 42

Registrerad: maj 2004

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?
Xerbee är inte uppkopplad
2012-04-17, 10:34   #3

ande85

Medlem

Registrerad: jun 2004

Citat:
Ursprungligen inskrivet av Xerbee Visa inlägg
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.
ande85 är inte uppkopplad
2012-04-17, 10:38   #4

Xerbee

Medlem

Xerbees avatar

Plats: 42

Registrerad: maj 2004

Citat:
Ursprungligen inskrivet av ande85 Visa inlägg
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
Xerbee är inte uppkopplad
2012-04-17, 10:42   #5

Elgot

Moderator

Elgots avatar

Plats: Linköping

Registrerad: apr 2004

Citat:
Ursprungligen inskrivet av ande85 Visa inlägg
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?
Elgot är uppkopplad nu
2012-04-17, 11:22   #6

ande85

Medlem

Registrerad: jun 2004

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å!
ande85 är inte uppkopplad
2012-04-17, 13:07   #7

havsmonstret

Medlem

havsmonstrets avatar

Plats: Helsingborg

Registrerad: apr 2010

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

Senast redigerad av havsmonstret 2012-04-17 klockan 13:08.
havsmonstret är inte uppkopplad Folding
2012-04-17, 13:49   #8

morphman86

Medlem

Plats: Göteborg

Registrerad: apr 2009

Citat:
Ursprungligen inskrivet av havsmonstret Visa inlägg
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; }
__________________
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
morphman86 är inte uppkopplad
2012-04-17, 14:16   #9

havsmonstret

Medlem

havsmonstrets avatar

Plats: Helsingborg

Registrerad: apr 2010

Citat:
Ursprungligen inskrivet av morphman86 Visa inlägg
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.
havsmonstret är inte uppkopplad Folding
2012-04-17, 14:48   #10

Elgot

Moderator

Elgots avatar

Plats: Linköping

Registrerad: apr 2004

Citat:
Ursprungligen inskrivet av havsmonstret Visa inlägg
Ä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).
Elgot är uppkopplad nu
2012-04-17, 15:32   #11

GFrost

Medlem

GFrosts avatar

Plats: Göteborg

Registrerad: okt 2010

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.
GFrost är inte uppkopplad
2012-04-17, 15:33   #12

NickoB

Medlem

NickoBs avatar

Plats: Jönköping

Registrerad: maj 2011

Citat:
Ursprungligen inskrivet av havsmonstret Visa inlägg
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.
NickoB är uppkopplad nu
2012-04-17, 15:40   #13

havsmonstret

Medlem

havsmonstrets avatar

Plats: Helsingborg

Registrerad: apr 2010

Citat:
Ursprungligen inskrivet av Elgot Visa inlägg
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.

Citat:
Ursprungligen inskrivet av NickoB Visa inlägg
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.
havsmonstret är inte uppkopplad Folding
2012-04-17, 16:00   #14

NickoB

Medlem

NickoBs avatar

Plats: Jönköping

Registrerad: maj 2011

Citat:
Ursprungligen inskrivet av havsmonstret Visa inlägg
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.
NickoB är uppkopplad nu
Senaste nyheterna

Redaktionens senaste nyhetsrubriker

Sök jobb