2016-04-08 14 views
0

Lesen und herumspielen, um statische Klassen und statische Methoden und ihre Unterschiede mit nicht statischen Methoden und deren Verwendung zu verstehen, die ich immer noch nicht bekomme, außer vielleicht für die Main-Methode, die nicht zu einer Instanz (Objekt) einer Klasse gemacht werden darf.Verwirrung mit System.ApplicationId;

Warum, wenn ich versuche zu verwenden:

using static System.ApplicationId; 

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

Dann versuchen Sie, ein Verfahren zu verwenden, um von ApplicationId wie Copy();

Die IDE? kann die Methode nicht finden?

das gleiche zu tun mit:

using static System.Console; 

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

Dann versuchen Sie eine Methode aus Console wie WriteLine();

zu finden Es finden kann, und ich kann es verwenden.

Warum passiert das?

Mein Verständnis ist, dass das beides statische Mitglieder sind? Ist das nicht der Grund, warum ich keine Instanzen dieser 2 Klassen machen kann? Aber ich kann die Methoden im zweiten Beispiel verwenden, aber nicht im ersten Beispiel, da es scheint, dass es mich nicht lässt (error: copy() existiert nicht im aktuellen Kontext ...).

Antwort

3

Die kurze Antwort ist, dass Sie nicht das static Schlüsselwort in einer using Aussage für nicht-statische Namensräume wie System.ApplicationId
verwenden Methoden, die auf einem nicht-statischen (Instanz) Klasse verwenden würden, müssen Sie zuerst eine Instanz machen davon mit new.

Die tl; dr Teil folgt
das Namespacepräfix System. jedes Mal, wenn Sie auf ApplicationId beziehen möchten schreiben Um zu vermeiden, Sie

using System; 

und dann in der Klasse hinzufügen können, können Sie auf die irgendeinemethode erhalten() -Methode mit:

new ApplicationId().someMethod(); 


lassen Sie uns nun über statische sprechen:
Bevor C# Version 6, man konnte einfach nicht using Aussage auf einer statischen Klasse verwenden, so dass der Zugriff auf eine statische Methode, um wie

System.Console.WriteLine() 

Sie würden zunächst die nicht-statische Mutter hinzufügen (System) mit

using System 

und dann der statischen Methode verweisen den Namespace

Console.WriteLine 

Mit der using static Syntax, die Sie hinzufügen der ‚Console.‘ Teil des Namespace einmal pro Klasse auf der using Aussage wie folgt:

`using static System.Console;` 

und dann können Sie WriteLine() statt Console.WriteLine verwenden. Ich muss raten, dass die WriteLine() Methode der häufigste Anwendungsfall für diese Funktionalität sein muss.

Wenn Sie https://msdn.microsoft.com/en-us/library/system.console%28v=vs.110%29.aspx auschecken zeigt es, dass System.Console eine statische Klasse ist, so using static ist dort geeignet.

System.ApplicationId ist jedoch nicht statisch (siehe https://msdn.microsoft.com/en-us/library/system.applicationid%28v=vs.110%29.aspx), daher können Sie using static nicht verwenden.

+0

Danke ich bekomme es :) – Johnson

0

ApplocationId ist keine statische Klasse, daher müssen Sie eine Instanz davon erstellen.

2

Die Antwort ist einfach, die Methoden in ApplicationId sind nicht als static markiert.

Lassen Sie uns den Unterschied zwischen statischen und Instanzmethoden finden Sie unter:

Statische Methode:

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

Instanzmethoden:

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

Wie Sie hier sehen können, müssen Sie eine Instanz, dass Klasse, um nicht statische Methoden zu verwenden. Bei statischen Methoden benötigen Sie keine Instanz.

Mit der Direktive using static können Sie den Klassennamen beim Aufruf einer statischen Methode weglassen.

"Aber warum erlaubt es uns nicht Instanzmethoden wie diese aufzurufen?" du hast gefragt. Wie ich oben gesagt habe, benötigen Sie eine Instanz, um Instanzmethoden aufzurufen. Wenn Sie nur den Methodennamen schreiben, um die Methode aufzurufen, woher weiß der Compiler, in welcher Instanz er aufgerufen werden soll?