Laden...

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

Erstellt von dragi vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.287 Views
D
dragi Themenstarter:in
368 Beiträge seit 2005
vor 15 Jahren
ReSharper meldet eine possible NullRefenrenceException und ich finde keine Lösung

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

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo dragi

Zuerst einmal finde ich es bedenklicher dass du "ref" für einen Referenztyp benutzt.
Siehe:

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

D
dragi Themenstarter:in
368 Beiträge seit 2005
vor 15 Jahren

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

5.941 Beiträge seit 2005
vor 15 Jahren

Salute dragi

Sieht schon besser aus 😃

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?

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

B
214 Beiträge seit 2005
vor 15 Jahren

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