HDSoftware Skrevet 12. september 2008 Del Skrevet 12. september 2008 Folkens Jeg har et object, "CustAddress" som har en kundes adresse. I Customer objektet har jeg en property som returnerer korrekt adresse: public string City { get { if(CustAddress != null) return CustAddress.City as string ?? ""; else return ""; } } Koden er helt grei og lesbar, men jeg ser jo at den kan forkortes noe: . . return CustAddress != null ? CustAddress.City as string ?? "" : ""; . . men jeg ser jo at dette forkludrer lesbarheten noe. Har .NET (C#) en mer "elegant" måte å gjøre dette på? Lenke til kommentar
Manfred Skrevet 12. september 2008 Del Skrevet 12. september 2008 Den siste der er jo virkelig smør på flesk. Propertien din er jo en string, så hvorfor skal du caste den? Og er CustAddress != null, så vil jo alltid .City være noe eller en tom string. return (CustAddress == null ? "" : CustAddress.City); Vil jo holde i haugevis... Lenke til kommentar
steingrim Skrevet 12. september 2008 Del Skrevet 12. september 2008 Kanskje han ikke vil returnere null hvis CustAddress.City er null? Lenke til kommentar
HDSoftware Skrevet 12. september 2008 Forfatter Del Skrevet 12. september 2008 Den siste der er jo virkelig smør på flesk. Propertien din er jo en string, så hvorfor skal du caste den? Og er CustAddress != null, så vil jo alltid .City være noe eller en tom string. return (CustAddress == null ? "" : CustAddress.City); Vil jo holde i haugevis... Det stemmer nok ikke. Et felt kan godt være NULL i en SQL tabell og mitt eksempel tar høyde for det. Prøver du koden over mot et felt som aksepterer NULL så får du en exception Kanskje han ikke vil returnere null hvis CustAddress.City er null? Det stemmer ;-) Lenke til kommentar
Manfred Skrevet 12. september 2008 Del Skrevet 12. september 2008 public string City { get { if(CustAddress != null) return CustAddress.City as string ?? ""; else return ""; } } Så kan noen forklare meg hvordan i all verden den propertien der kan returnere null... Lenke til kommentar
steingrim Skrevet 12. september 2008 Del Skrevet 12. september 2008 Den der kan ikke det, men din versjon kunne det hvis CustAddress.City er null. Lenke til kommentar
Manfred Skrevet 13. september 2008 Del Skrevet 13. september 2008 Min versjon? Jeg kom bare med et eksempel for å skrive om den andre linjen. Han skriver jo at den første er propertien hans... den kan jo aldri returnere null. Koden i Propertien hans ser jo slik ut: if(CustAddress != null) return CustAddress.City as string ?? ""; else return ""; Når han da uansett sjekker på om objektet "CustAddress" er null først. Hvis den ikke er det, så kan jo aldri CustAddress.City være null, siden den propertien selv returnerer "" dersom den i utgangspunktet er null! Lenke til kommentar
GeirGrusom Skrevet 13. september 2008 Del Skrevet 13. september 2008 Menneh, hva er poenget med med den if setningen? return CustAddress.City as string ?? ""; Skal være nok. Denne vil returnere "" dersom CustAddress er null, eller dersom CustAddress ikke er en string. Lenke til kommentar
steingrim Skrevet 14. september 2008 Del Skrevet 14. september 2008 Når han da uansett sjekker på om objektet "CustAddress" er null først. Hvis den ikke er det, så kan jo aldri CustAddress.City være null, siden den propertien selv returnerer "" dersom den i utgangspunktet er null! Koden til CustAddress.City har vi ikke sett. Hvis CustAddress er != null og CustAddress.City ikke gjør tilsvarende sjekker, det har ikke trådstarter nevnt noe om såvidt jeg kan se, så må han gjøre denne sjekken i Customer. Dermed må han ikke bare sjekke om CustAddress!=null men også om CustAddress.City != null. Dette er så elementært at jeg må ha misforstått noe. Menneh, hva er poenget med med den if setningen? return CustAddress.City as string ?? ""; Denne vil returnere "" dersom CustAddress er null, eller dersom CustAddress ikke er en string. Vil ikke denne gi NullReferenceException hvis CustAddress er null altså? Lenke til kommentar
Manfred Skrevet 14. september 2008 Del Skrevet 14. september 2008 Menneh, hva er poenget med med den if setningen? return CustAddress.City as string ?? ""; Denne vil returnere "" dersom CustAddress er null, eller dersom CustAddress ikke er en string. Vil ikke denne gi NullReferenceException hvis CustAddress er null altså? as er en safe cast, og ?? sjekker jo på NULL Lenke til kommentar
steingrim Skrevet 14. september 2008 Del Skrevet 14. september 2008 Ok, la oss få litt kode å snakke om, så vi ikke snakker heeeelt forbi hverandre. c2-objektet i Main har en CustAddress som er null og en City-property som er implementert slik dere foreslår. Det gir NullReferenceException. using System; class CustAddress { private string city; public CustAddress(string city) { this.city = city; } public string City { get { return city; } } } class Customer { private CustAddress custAddress; public Customer(CustAddress custAddress) { this.custAddress = custAddress; } public CustAddress CustAddress { get { return custAddress; } } public string City { get { return CustAddress.City as string ?? ""; } } } class Program { public static void Main(string[] args) { Customer c1 = new Customer(new CustAddress("foobar")); Console.WriteLine(c1.City); Customer c2 = new Customer(null); Console.WriteLine(c2.City); } } Lenke til kommentar
alftore Skrevet 15. september 2008 Del Skrevet 15. september 2008 (endret) get { return custAddress.City as string ?? ""; } med liten 'c' fungerer det kanskje bedre. edit: nvm ser propertien nå.. class CustAddress { private string city; public CustAddress(string city) { this.city = city; } public string City { get { return city as string ?? ""; } } } Endret 15. september 2008 av alftore Lenke til kommentar
alftore Skrevet 15. september 2008 Del Skrevet 15. september 2008 Blir du ikke lett forvirra når alt har så likt navn? Lenke til kommentar
j000rn Skrevet 15. september 2008 Del Skrevet 15. september 2008 Siden den allerede er string så er vel "as string" smør på flesk.... Blir nesten som MinString.ToString().ToString().ToString().ToString().ToString().ToString().ToString().ToS ring().ToString().ToString();.... Dette holder i massevis: get { return custAddress.City ?? ""; } Lenke til kommentar
alftore Skrevet 15. september 2008 Del Skrevet 15. september 2008 Problemet er at han initierer customer klassen med et null object Customer c2 = new Customer(null); Console.WriteLine(c2.City); Så da må du nok pent sjekke om den er null først. Ellers kan du jo ikke hente ut City strengen. Lenke til kommentar
j000rn Skrevet 15. september 2008 Del Skrevet 15. september 2008 (endret) Burde vel kanskje lest hele innlegget... Sånn da get { return custAddress == null ? "" : (custAddress.City ?? ""); } Endret 15. september 2008 av j000rn Lenke til kommentar
steingrim Skrevet 16. september 2008 Del Skrevet 16. september 2008 Nettopp Det var hele poenget mitt ørten poster opp. Lenke til kommentar
Manfred Skrevet 16. september 2008 Del Skrevet 16. september 2008 Trådene blir så fine når alle egentlig er enige, men snakker rundt hverandre og misforstår Lenke til kommentar
HDSoftware Skrevet 16. september 2008 Forfatter Del Skrevet 16. september 2008 Ok. La meg gjøre dette helt klart med en gang: ThisAddress.City Her kan godt ThisAddress være ulik NULL og City kan godt være null. Derfor vil ikke Manfreds kode gi noe resultat. Så kan man selvsagt spørre seg "Hvorfor i all værden er City = NULL?" og svaret er ganske enkelt: Hvis man i databasen krysser av ALLOW NULLS på et felt så vil Visual Studio generere properties som NULLABLE i LINQ. Av den grunn må man både sjekke objektet og propertien i objektet. Håper dette satte en effektiv stopper for disputten ;-) Lenke til kommentar
steingrim Skrevet 16. september 2008 Del Skrevet 16. september 2008 Trådene blir så fine når alle egentlig er enige, men snakker rundt hverandre og misforstår Æsj, var VI enige? I så fall mener jeg.. hm.. motsatt av det jeg sa! Eller noe. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå