7
votes

C # Accéder à un membre non statique dans une fonction statique

J'ai donc une fonction:

List<string> names = new string();

private static void getName(string name)
{
    names.add(name);
}


3 commentaires

Pourquoi GetName Static est-il en premier lieu?


C'est une situation simplifiée hypothétique.


Le nom de la méthode doit être addname (nom de chaîne) .


5 Réponses :


2
votes

Vous devez faire des noms statiques si vous souhaitez l'utiliser à partir de l'intérieur d'une méthode statique: xxx

Le problème est que getname est défini sur votre type , pas sur une instance du type. Cependant, noms est défini pour chaque instance de votre type obtient sa propre valeur.


1 commentaires

@Drake: Vous pouvez accéder aux membres statiques des instances, mais pas l'inverse.



0
votes

Les méthodes statiques ne peuvent pas accéder à des champs de classe. Soit faire des noms statiques ou rendre getname () non statique. Qu'entendez-vous par «compatible». Demandez-vous ... La méthode doit-elle être statique? Quel est son but et comment avez-vous l'intention de l'utiliser?


0 commentaires

0
votes

Vous ne pouvez pas y accéder de cette façon, vous devez instancier la classe contenant un membre.


0 commentaires

12
votes

Vous devez dire au système que em> liste des noms qui vous intéressent. Cela fait partie de l'état d'un objet, une instance de la classe ... mais lequel? Peut-être que vous avez créé plusieurs instances em> de la classe - peut-être que vous avez créé no em> les instances de la classe. La méthode statique n'a aucune visibilité de cela - de sorte que l'instance souhaitez-vous que la valeur de la valeur de la variable code> code> de?

Pour le mettre dans un autre exemple, supposons que nous ayons une classe comme celle-ci:

public class Person
{
    public double MassInGrams { get; set; }
    public double HeightInMetres { get; set; }

    public static double ComputeBodyMassIndex()
    {
        // Which person are we interested in?
    }
}

Person p1 = new Person { MassInGrams = 76203, HeightInMetres = 1.8 };
Person p2 = new Person { MassInGrams = 65000, HeightInMetres = 1.7 };

double bmi = Person.ComputeBodyMassIndex();


5 commentaires

Pouvez-vous expliquer la solution de méthode d'instance un peu plus. En utilisant l'exemple que j'ai créé. Je crois que les noms sont actuellement une référence.


@Drake: noms serait une référence à une instance list - Vous avez besoin d'une référence à une instance de la classe contenant. Regardez mon Personne d'un exemple qui devrait démontrer pourquoi il y a un problème. Une fois que vous avez compris le problème, vous pouvez avoir plus d'une idée de quoi faire.


@Drake - Afin de ComputebodyMassindex () Le système doit savoir quelle personne doit calculer. Donc, vous passez dans un objet personne et votre ComputebodyMassindex () prend maintenant cette personne Static Double ComputebodyMassIndex (Personne P) On peut calculer l'IMC. Dans votre cas, vous souhaitez ajouter un chaîne à une liste . Le problème est noms fait partie de la classe, lorsque vous créez un objet de cette classe, vous pouvez accéder aux noms directement.


Ce n'est pas une fonction que j'appelle donc cela ne serait pas applicable. C'est une fonction de rappel Win32 que j'ai besoin d'accéder. Le rappel est statique, ma liste n'est pas.


@Drake: Ce n'est pas clair exactement ce que vous voulez dire lorsque vous dites que c'est une fonction de rappel Win32. Voulez-vous dire que c'est quelque chose que vous passez d'une manière ou d'une autre dans une fonction Win32 en tant que délégué, et elle s'appelle-t-elle? Si tel est le cas, faites-en simplement une méthode d'instance et construisez un délégué approprié avec la bonne cible.



1
votes

noms est un objet qui existera dans les cas de la classe E.G. MyClass MC = Nouveau MyClass (); Vous pouvez accéder à MC.NAMES . Un champ statique peut être appelé sans instance de la classe juste avec le nom de classe, par ex. myClass.getName (""); fonctionnera. Donc, lorsque vous pensez logiquement, la classe ne contient pas de noms, uniquement les «instances de cette classe» le contiennent. Par conséquent, vous apportez également cette liste statique aussi et ce sera «la même instance de liste» partout lorsque vous appelez myClass.Names ou effectuez la méthode getName non statique, et cela ne sera appelé que des instances , Par conséquent, aucun myClass.getName ("") sera possible, mais mc.getname (""); C'est une question de ce que vous essayez exactement de faire. < / p>


0 commentaires