2010-12-06 1 views
5

Ich lerne C# und es gibt etwas, das ich nicht verstehe, dass ich keine Hilfe online finden konnte.Warum bekomme ich "kann nicht mit einer Instanz Referenz zugegriffen werden" bei Verwendung von testring.Join, aber nicht teststring.Split? (C#)

string[] = testarray = { "test1", "test2", "test3" }; 
teststring = teststring.Join(" ", testarray); 

Dieser schlägt mit der folgenden Fehlermeldung:

Mitglied 'string.Join (string, params String [])' kann nicht mit einer Instanz Referenz zugegriffen werden; qualifiziere es stattdessen mit einem Typnamen.

Es ist jedoch funktionieren, wenn ich ändern:

teststring = string.Join(" ", testarray); 

aber Wenn ich die Funktion Split wie in verwenden:

teststring = teststring.Split(new char[] {' '}); 

ich mehr bin kein erhalte eine Fehlermeldung. Ich nehme an, das hat etwas damit zu tun, dass bestimmte Funktionen der String-Klasse statisch sind und einige nicht, aber wie kann ich feststellen, welche Funktion statisch ist und welche nicht? (Wenn das der Grund ist)

Diese erzwungenen Aufruftechniken zwischen statisch/nicht-statisch sicher ist etwas gewöhnungsbedürftig.

Antwort

4

Sie haben den Grund richtig; String.Join ist statisch, aber String.Split ist nicht.

Ich erhalte keinen Fehler mehr. Ich nehme an, das hat etwas damit zu tun, dass bestimmte Funktionen der String-Klasse statisch sind und einige nicht, aber wie kann ich feststellen, welche Funktion statisch ist und welche nicht? (Wenn dies der Grund ist)

Sie können sich die MSDN-Dokumentation ansehen.

Zum Beispiel, auf der Seite für String.Join, gibt es eine S neben der lila Box für jede Methode; Dies zeigt an, dass die Methode als static deklariert ist. Wenn Sie auf eine bestimmte Überladung klicken, sehen Sie außerdem die Methode als static deklariert. Zum Beispiel

public static string Join(
string separator, 
IEnumerable<string> values 
) 

jedoch für String.Split, gibt es keine S neben dem lila Box für jede Methode. Für keine der speziellen Überladungen wird die Methode als static deklariert. Zum Beispiel

public string[] Split(
params char[] separator 
) 
4

Dies ist, weil Join eine statische Methode für Zeichenfolge ist. Statische Methoden werden immer mit dem Klassennamen und nicht mit dem Namen einer Variablen für eine Instanz dieser Klasse aufgerufen.

+0

ich auf dem richtigen Weg war dann, wie kann ich feststellen, ob eine Funktion statisch ist oder nicht sagen String? –

+0

Sie haben die vollständige Frage nicht beantwortet. –

6

Sie können für die String class für eine Liste aller verfügbaren Methoden auf MSDN in der Dokumentation suchen. Statische Methoden haben eine orange „S“ -Symbol neben ihnen, während Instanzmethoden nicht, zB:

alt text

Wenn über den Unterschied zwischen statischen und Instanzmethoden zu denken, darüber nachzudenken, ob die Funktionalität dieser Methode hängt auf einer bestimmten Instanz der Klasse.
Wenn die Antwort ja lautet, wird sie wahrscheinlich als Instanzmethode implementiert. und wenn nicht, ist es wahrscheinlich eine statische Methode.
Zum Beispiel trennt die Split Methode eine bestimmte Instanz der String Klasse (der String, aus dem es aufgerufen wird) in ein Array.
Im Gegensatz dazu ist die Join-Methode wie eine Hilfsmethode, die aufgerufen werden kann, um ein durch einen String getrenntes Array zu kombinieren - ohne zuerst eine Instanz der String-Klasse zu erstellen, um sie aufzurufen.

+0

Sie benötigen eine Instanz von 'string', die als Verbindungszeichenfolge dient. So könnte man sich vorstellen, dass "String.Join" nicht statisch ist, sondern eine Instanzmethode ist und als "" aufgerufen wird. Join (strings) '. – jason

+0

@Jason Das stimmt, obwohl wenn Join als eine Instanzmethode implementiert wurde, scheint es sinnvoller zu sein, dass es auf dem Array von Werten definiert wird, die verbunden werden, und nicht auf dem Trennzeichen. – Donut

2

Join ist eine statische Methode für die String-Klasse, während Split eine Instanzmethode ist. Um herauszufinden, welches was ist, klicken Sie mit der rechten Maustaste auf String und gehen Sie zur Definition. Dies zeigt Ihnen die Definition der Klasse (mit Methodendeklarationen usw.)

2

Ich würde davon ausgehen, dass die Methode in keiner Weise direkt auf die String Referenz bezogen ist und um jede Verwirrung zu vermeiden, machten sie es a statische Methode von String stattdessen, während Split direkt verwandt ist, wie Sie diese bestimmte String Instanz teilen.

+0

Gute Antwort. +1 –

1

Dies ist die perfekte Antwort .. Es funktioniert gut ..

Eine statische Member-Funktion gehört nicht zu einer bestimmten Instanz einer Klasse, sondern auf den Klasse-Typen selbst. Wenn Sie versuchen, auf eine bestimmte Instanz zuzugreifen, wird dies vom Compiler nicht zugelassen.

die Funktion korrekt aufzurufen, würden Sie

classname.methodname (Parameter)

statt Klassenname cl = new Klassenname() schreiben; cl.methodenname (Parameter);

oder entfernen Sie die statische modifiziert.

Weitere Bitte beachten dies .. http://www.codeguru.com/forum/showthread.php?t=438550

Verwandte Themen