Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

ReSharper meldet eine possible NullRefenrenceException und ich finde keine Lösung
dragi
myCSharp.de - Member



Dabei seit:
Beiträge: 368
Herkunft: Moers

Themenstarter:

ReSharper meldet eine possible NullRefenrenceException und ich finde keine Lösung

beantworten | zitieren | melden

Hallo,

ReSharper meldet mir eine Possible NullReferenceException bei queryParams.GetValues(key)[0], doch ich bekomme den Code nicht so geschrieben das diese verschwindet.


	internal int CreateMiddleStatementPart(ref StringBuilder sb, NameValueCollection queryParams)
		{
			string[] keyCollection = queryParams.AllKeys;
			string clause = " WHERE ";
			int noStatements = queryParams.Count;
			if (noStatements == 0)
			{
				sb.Append(clause);
			}
			else
			{
				int listcount = 0;
				foreach (string key in keyCollection)
				{
					listcount = ++listcount;
					sb.Append(clause);
					if (queryParams != null && queryParams.GetValues(key) != null && key != null)
					{
						object queryValue = queryParams.GetValues(key)[0]; // <---------- Hier meckert der ReSharper!
						if (queryValue is string)
						{
							queryValue = string.Format(" '{0}' ", queryValue);
						}

						sb.Append(string.Format("{0} = {1}", key, queryValue));
						clause = listcount != keyCollection.Length ? " AND " : " ";
					}
				}
			}

			return noStatements;
		}

Hat jemand von euch eine Idee wie ich den Code so umschreibe das es passt?

Vielen Dank

dragi
private Nachricht | Beiträge des Benutzers
Peter Bucher
myCSharp.de - Experte

Avatar #jVxXe7MDBPAimxdX3em3.jpg


Dabei seit:
Beiträge: 5.940
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Hallo dragi

Zuerst einmal finde ich es bedenklicher dass du "ref" für einen Referenztyp benutzt.
Siehe:
- [Artikel] C# und Übergabemechanismen: call by value vs. call by reference (ref/out)

Zu deinem Problem... GetValues(key) könnte null sein, also nimmst du das und prüfst es auf null.
Danach ob es mindestens ein Element enthält, dann ist der Zugriff sicher.
Abgesehen davon kriegst du sowieso einen String zurück, du brauchst da nichts mit object und dem is-Operator zu hantieren.


string[] queryArray = queryParams.GetValues(key); 
string queryResult = null;
if(queryArray.Length ≥ 1) {
    queryResult = queryArray[0];
}

if (queryValue != null) {
    queryValue = string.Format(" '{0}' ", queryValue);
}


Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

- https://peterbucher.ch/ - Meine persönliche Seite
- https://fpvspots.net/ - Spots für FPV Dronenflüge
private Nachricht | Beiträge des Benutzers
dragi
myCSharp.de - Member



Dabei seit:
Beiträge: 368
Herkunft: Moers

Themenstarter:

beantworten | zitieren | melden

Hallo Peter,

vielen Dank für deine Lösung! Ich ahbe die Methode dank deiner Hilfe nun geändert und Resharper meckert nicht mehr. Hier noch für alle Leser die geänderte Methode:


		/// <returns>the number of where clause statements</returns>
		internal int CreateMiddleStatementPart(ref StringBuilder sb, NameValueCollection queryParams)
		{
			string[] keyCollection = queryParams.AllKeys;
			string clause = " WHERE ";
			int noStatements = queryParams.Count;
			if (noStatements == 0)
			{
				sb.Append(clause);
			}
			else
			{
				int listcount = 0;
				foreach (string key in keyCollection)
				{
					listcount = ++listcount;
					sb.Append(clause);
					string[] queryArray = queryParams.GetValues(key);
					string queryResult = null;
					string queryValue = null;
					if (queryArray != null && queryArray.Length ≥ 1)
					{
						queryResult = queryArray[0];
					}

					if (queryResult != null)
					{
						queryValue = string.Format(" '{0}' ", queryValue);
					}

					sb.Append(string.Format("{0} = {1}", key, queryValue));
					clause = listcount != keyCollection.Length ? " AND " : " ";
				}
			}

			return noStatements;
		}

Deine Anmerkung zu der Parameter Übergabe mit ref verstehe ich allerdings nicht. Anscheinend habe ich deinen Artikel und die MSDN falsch verstanden, aber ich möchte doch genau diesen StringBuilder weiter verarbeiten und diesen ja wirklich in dieser Methode verändern.

Ausserhalb der Methode enthält der StringBuilder ja schon etwas und in dieser Methode möchte ich genau diesen SB weiter verändern. Deshlab nehme ich den ref Parameter!?

Gruß

dragi
private Nachricht | Beiträge des Benutzers
Peter Bucher
myCSharp.de - Experte

Avatar #jVxXe7MDBPAimxdX3em3.jpg


Dabei seit:
Beiträge: 5.940
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Salute dragi

Sieht schon besser aus :)

Zitat von dragi
Deine Anmerkung zu der Parameter Übergabe mit ref verstehe ich allerdings nicht. Anscheinend habe ich deinen Artikel und die MSDN falsch verstanden, aber ich möchte doch genau diesen StringBuilder weiter verarbeiten und diesen ja wirklich in dieser Methode verändern.

Ausserhalb der Methode enthält der StringBuilder ja schon etwas und in dieser Methode möchte ich genau diesen SB weiter verändern. Deshlab nehme ich den ref Parameter!?
Hast du meinen angeguckt und auch die Tabelle dazu?
- http://www.aspnetzone.de/blogs/peterbucher/archive/2007/02/12/c-parameter-bergabe-default-by-value-by-reference-und-out.aspx

Hast du es schon einmal ohne "ref" probiert?
Damit verhält es sich genau so, wie jetzt auch.

"ref" brauchst du nur bei Referenztypen deren _Referenz_ du innerhalb einer Methode ändern möchtest.
Aber _nicht_ wenn du mit Members davon arbeitest, bspw. Eigenschaften erstellst, Methoden benutzt.


Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

- https://peterbucher.ch/ - Meine persönliche Seite
- https://fpvspots.net/ - Spots für FPV Dronenflüge
private Nachricht | Beiträge des Benutzers
Bionic
myCSharp.de - Member



Dabei seit:
Beiträge: 214

beantworten | zitieren | melden

Schlägt dir Resharper nicht selbst eine Lösung des NullReferenceException-Problems vor?
Also bei mir macht er das, dann hilft ein Tastenkürzel [ALT]+[ENTER] und nochmal [ENTER]. Zack Bum hab ich die automatische Prüfung auf NULL von Resharper geschrieben bekommen :-)

Grüße
.:: SilvrGame - Browsergame Development with Silverlight
.:: Bionic's blOg
private Nachricht | Beiträge des Benutzers