Gå til innhold

Anbefalte innlegg

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
Videoannonse
Annonse
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

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
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

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

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 av alftore
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...