2010-12-06 13 views
5

私はC#を学んでいます。私はオンラインに関する何かの助けを見つけることができなかったことを私が理解していないことがあります。これは、次のエラーメッセージで失敗teststringを使用しているときに「インスタンス参照でアクセスできません」というメッセージが表示されるのはなぜですか? (c#)

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

メンバー 'string.Join(ストリング、paramsは列[])が' インスタンス参照してアクセスすることができません。代わりにタイプ名で修飾してください。

私が変更した場合しかしそれは動作しません:私は、もはやエラーを取得しています

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

:のように私はしかし、機能分割を使用しない場合は

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

。私はこれが静的な文字列クラスのいくつかの関数と関係があると仮定しますが、どの関数が静的であり、どの関数が静的でないかをどのように知ることができますか? (これが理由であれば)

これらの静的/非静的な呼び出し技術は、慣れ親しんだものです。

答えて

4

あなたは正当な理由があります。 String.Joinは静的ですが、String.Splitはありません。

私はもはやエラーになりません。私はこれが静的な文字列クラスのいくつかの関数と関係があると仮定しますが、どの関数が静的であり、どの関数が静的でないかをどのように知ることができますか? (これが理由ならば)

MSDNのドキュメントを見ることができます。

たとえば、String.Joinのページでは、各方法の紫色ボックスの隣にSがあります。メソッドがstaticと宣言されていることを示します。さらに、特定のオーバーロードをクリックすると、staticと宣言されたメソッドが表示されます。例えば、

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

しかしながら、String.Splitため、各方法のための紫色のボックスに次何Sは存在しません。特定の過負荷のどれに対しても、staticと宣言されたメソッドはありません。たとえば、

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

これは、Joinが文字列の静的メソッドであるためです。静的メソッドは常に、そのクラスのインスタンスの変数名ではなく、クラス名を使用して呼び出されます。

+0

については

私は、関数が静的であるかどうかの文字列を言うならば、私が言うことができるか、そして正しい軌道に乗っていましたか? –

+0

あなたは完全な質問に答えていません。 –

6

String classのMSDNのドキュメントを参照して、使用可能なすべてのメソッドのリストを参照してください。静的およびインスタンスメソッドの違いについて考えるとき

alt text

、そのメソッドの機能が依存するかどうかを考える:インスタンスメソッドがいない間静的メソッドは、例えば、横にオレンジ色の「S」アイコンを持っていますクラスの特定のインスタンスに対して
答えが「はい」の場合は、インスタンスメソッドとして実装される可能性があります。そうでない場合は、静的メソッドである可能性があります。
例えば、Splitメソッドは、Stringクラスの特定のインスタンス(呼び出される文字列)を配列に分割します。
これに対し、Joinメソッドはユーティリティメソッドに似ています。このメソッドは、文字列で区切られた配列を呼び出すために呼び出すことができます。最初にStringクラスを呼び出すことなく呼び出すことができます。

+0

結合文字列として機能するには 'string'のインスタンスが必要です。ですから、 'String.Join'は静的ではなくインスタンスメソッドであり、' "、"。Join(strings) 'として呼び出されると想像できます。 – jason

+0

@Jasonそれは本当ですが、結合がインスタンスメソッドとして実装されている場合、セパレータではなく、結合されている値の配列に定義されているように思えます。 – Donut

2

結合はStringクラスの静的メソッドですが、Splitはインスタンスメソッドです。どちらが正しいかを知るには、文字列を右クリックして定義に行きます。これはあなたにクラスの定義を表示します(メソッド宣言などで)

2

私はその方法がString参照に直接関係していないと考えています。混乱を避けるために、代わりにStringの静的メソッドを使用しますが、Splitはその特定のStringインスタンスを分割するときに直接関連します。

+0

良い答え。 +1 –

1

これはこれはよくワークス..完璧な答え..です

静的メンバ関数は、クラスの特定のインスタンスにではなく、クラス型自体には属していません。その結果、特定のインスタンスに対してアクセスしようとすると、コンパイラーはこれを許可しません。正しく、あなたが

classname.methodname(パラメータ)

ではなく クラス名CL =新しいクラス名を()書きしなければならない関数を呼び出す

。 cl.methodname(parameter);

または静的に変更したものを削除してください。もっとこれを参照してください。.. http://www.codeguru.com/forum/showthread.php?t=438550

関連する問題