223 votes

Membre «<method>» ne sont pas accessibles avec une référence d’instance</method>

Je suis arriver en C# et je vais avoir ce problème:

namespace MyDataLayer
{
    namespace Section1
    {
        public class MyClass
        {
            public class MyItem
            {
                public static string Property1{ get; set; }
            }
            public static MyItem GetItem()
            {
                MyItem theItem = new MyItem();
                theItem.Property1 = "MyValue";
                return theItem;
            }
        }
     }
 }

J'ai ce code sur un UserControl:

using MyDataLayer.Section1;

public class MyClass
{
    protected void MyMethod
    {
        MyClass.MyItem oItem = new MyClass.MyItem();
        oItem = MyClass.GetItem();
        someLiteral.Text = oItem.Property1;
    }
}

Tout fonctionne bien, sauf quand je vais pour accéder Property1. L'intellisense seulement me donne "est Égal, GetHashCode, GetType, et ToString" options". Quand je souris sur l' oItem.Property1, Visual Studio me donne cette explication:

Member 'MyDataLayer.Section1.MyClass.MyItem.Property1.get' cannot be accessed with an instance reference, qualify it with a type name instead

Je ne suis pas certain de ce que cela signifie, j'ai fait quelques recherches sur google, mais n'était pas en mesure de le comprendre. Quelqu'un peut-il aider cette newbie?

merci, anders

320voto

Mehrdad Afshari Points 204872

En c#, contrairement à VB.NET et Java, vous ne pouvez pas accéder `` membres avec une syntaxe d’instance. Vous devez faire :

pour désigner cette propriété ou supprimer le modificateur de (qui est ce que vous voulez probablement faire). Pour une idée conceptuelle de ce que `` est, voir mon autre réponse.

50voto

SLaks Points 391154

Vous pouvez uniquement accéder à des membres statiques en utilisant le nom du type.

Par conséquent, vous devez écrire à la main,

MyClass.MyItem.Property1

Ou (ce qui est probablement ce que vous devez faire) font Property1 d'une propriété d'instance par la suppression de l' static mot-clé à partir de sa définition.

Propriétés statiques sont partagés entre toutes les instances de la classe, de sorte qu'ils ont seulement une valeur. La façon dont il est défini maintenant, il n'y a pas de point dans la prise de toutes les instances de votre MyItem classe.

31voto

CarlH Points 58

J'ai eu le même problème - bien que quelques années plus tard, certains peuvent trouver quelques conseils utiles:

N'utilisez pas "statiques" gratuitement!

Comprendre ce que ‘statique' implique en termes de temps d'exécution et le temps de compilation de la sémantique (le comportement) et de la syntaxe.

  • Une entité statique sera construit automatiquement un certain temps avant de
    sa première utilisation.

  • Une entité statique a un emplacement de stockage alloué, et qui est
    partagé par tous ceux qui l'accès de cette entité.

  • Une entité statique ne peut être accessible que par le biais de son nom de type, pas
    par le biais d'un exemple de ce type.

  • Une méthode statique ne dispose pas d'un implicite de cet argument, comme le fait un méthode d'instance. (Et, par conséquent, une méthode statique a moins exécution
    frais généraux – l'une des raisons de l'utiliser.)

  • Pensez-fil de sécurité lors de l'utilisation des entités statiques.

Quelques détails sur la statique dans MSDN:

Les Classes statiques en C# http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs. 90).aspx

Constructeurs statiques en C# http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs. 90).aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X