2016-04-08 28 views
0

静的なクラスと静的なメソッドとそれらの違いを、静的なメソッドとそれらの使い方を理解するために読んだり混乱させたりすることは、クラスのインスタンス(オブジェクト)System.ApplicationIdとの混乱。

私が使用しようとする理由:

using static System.ApplicationId; 

public class Program 
{ 
    static void Main() 
    { 
     Copy(SOMETHING)// Copy method doesn't exist 
    } 
} 

その後からメソッドを使用しようとするには、IDE

Copy();ようをAPPLICATIONID?メソッドを見つけることができませんか?同じことを

using static System.Console; 

public class Program 
{ 
    static void Main() 
    { 
     Writeline("Hello"); // OK 
    } 
} 

は、それはそれを見つけることができますWriteLine();

のようなコンソールから方法を見つけようと、私はそれを使用することができます。

どうしてですか?

私が理解していることは、それらは両方とも静的メンバーであることですか?その2つのクラスのインスタンスを作ることができない理由はそれですか?しかし、私は2番目の例でメソッドを使うことはできますが、最初のものではできません。私にはできません(エラー:copy()は現在のコンテキストに存在しません...)。

答えて

3

短い答えはあなたが非静的(インスタンス)クラスのメソッドを使用するにはSystem.ApplicationId
のような非静的な名前空間のためにusing文でstaticキーワードを使用しないことで、あなたは最初のインスタンスを作成する必要がありますnewを使用しています。

TL; DR部分は、あなたがクラスで、その後

using System; 

とを追加することができますがApplicationIdを参照するたびに名前空間接頭辞System.を書き出すすることを避けるために
を次の、あなたはのsomeMethodに得ることができます()メソッド:

new ApplicationId().someMethod(); 


今度は、静的について話しましょう:
C#バージョン6の前に、あなたはちょうどあなたが最初に非静的親(System)を追加したい

System.Console.WriteLine() 

などの静的メソッドへのアクセスを取得するので、静的クラスにusingステートメントを使用することができませんでしたその後、

using System 

using static構文では、名前空間

Console.WriteLine 

を使用して静的メソッドを参照してください、あなたが追加そのようなusingステートメントに一度クラスごとに、名前空間の「Console.」部分:

`using static System.Console;` 

、その後、あなたはWriteLine()の代わりConsole.WriteLineを使用することができます。私はWriteLine()メソッドがこの機能の最も一般的な使用例であることを推測しなければなりません。

https://msdn.microsoft.com/en-us/library/system.console%28v=vs.110%29.aspxをチェックすると、System.Consoleが静的クラスであることが示されます。したがって、using staticが適切です。

ただし、System.ApplicationIdは非静的であり(https://msdn.microsoft.com/en-us/library/system.applicationid%28v=vs.110%29.aspx参照)、using staticは使用できません。

+0

ありがとう私はそれを得る:) – Johnson

0

ApplocationIdは静的クラスではないため、インスタンスを作成する必要があります。

2

答えは簡単です、ApplicationIdのメソッドはstaticとしてマークされないです。

Random aRandomObject = new Random(); 
aRandomObject.Next(); 
************* **** 
    ^ ^
name of an method 
instance of name 
Random 

あなたがここに見ることができるように、あなたはそれのインスタンスを必要とする:

staticメソッド:

Console.WriteLine(); 
******* ********* 
^  ^
class method 
name  name 

インスタンスメソッド

のは、静的およびインスタンスメソッドの違いを見てみましょう非静的メソッドを使用するためのクラスです。しかし、静的メソッドの場合、インスタンスは必要ありません。

using staticディレクティブを使用すると、のstaticメソッドを呼び出すときにクラス名を省略できます。

"なぜこのようなインスタンスメソッドを呼び出すことができないのですか?"あなたは尋ねました。上で述べたように、インスタンスメソッドを呼び出すインスタンスが必要です。メソッド名を記述してメソッドを呼び出すだけであれば、コンパイラはどのインスタンスを呼び出したいのかを知ることができますか?