Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do I get "cannot be accessed with an instance reference" when using teststring.Join but not teststring.Split? (c#)

Tags:

c#

I'm learning c# and there is something I do not understand that I've been unable to find any help about online.

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

This fails with the following error message:

Member 'string.Join(string, params string[])' cannot be accessed with an instance reference; qualify it with a type name instead.

It does however work if I change to:

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

If I however use the function Split as in:

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

I am no longer getting an error. I assume this has something to do with certain functions of the string class being static and some not, but how can I tell which function is static and which is not? (if this is the reason)

These enforced calling techniques between static / non-static sure is something to get used to.

like image 688
Kristian Erik Tigersjäl Avatar asked Dec 06 '10 16:12

Kristian Erik Tigersjäl


3 Answers

You can look at MSDN's documentation for the String class for a list of all available methods. Static methods have an orange "S" icon next to them, while instance methods do not, e.g.:

alt text

When thinking about the difference between static and instance methods, think about whether the functionality of that method depends on a particular instance of the class.
If the answer is yes, then it's likely to be implemented as an instance method; and if not, it's likely to be a static method.
For example, the Split method separates a specific instance of the String class (the string from which it is called) into an array.
In contrast, the Join method is like a utility method, which can be called upon to combine an array separated by a string -- without first creating an instance of the String class in order to call it.

like image 144
Donut Avatar answered Nov 10 '22 14:11

Donut


You are correct on the reason; String.Join is static but String.Split is not.

I am no longer getting an error. I assume this has something to do with certain functions of the string class being static and some not, but how can I tell which function is static and which is not? (if this is the reason)

You could look at the MSDN docs.

For example, on the page for String.Join, there is an S next to the purple box for each method; this indicates that the method is declared as static. Additionally, if you click on a particular overload you'll see the method declared as static. For example,

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

However, for String.Split, there is no S next to the purple box for each method. For none of the particular overloads is the method declared as static. For example

public string[] Split(
params char[] separator
)
like image 43
jason Avatar answered Nov 10 '22 16:11

jason


This is because Join is a static method on string. static methods are always called using the class name, not the name of a variable for an instance of that class.

like image 4
Jim L Avatar answered Nov 10 '22 16:11

Jim L