2010-09-09 5 views
1

Tout a commencé à apprendre C# (en XAML), donc apprécier quelques précisions:Que signifient 2 parenthèses dans une ligne dans xaml.cs?

((MSAvalon.Windows.Serialization.ILoaded)(_Text_2_)).DeferLoad(); 

Je ne sais pas ce que tous les parenthèses signifie ... que cela signifie « _Text_2_ » est un enfant de l'objet « MSAvalon.Windows. Serialization.ILoaded "?

et si oui ... pourquoi pas seulement quelque chose comme:

MSAvalon.Windows.Serialization.ILoaded._Text_2.DeferLoad(); 
+2

() sont des parenthèses, [] sont des parenthèses, {} sont des accolades. –

+0

pour approfondir ma compréhension des parenthèses ... comment les parenthèses < > fonctionnent-elles en C#? Quel est le terme que je devrais rechercher pour comprendre < > utilisés parfois lors de la déclaration d'un nouvel objet – bcm

+1

< > sont appelés des chevrons. Leur signification dépend du contexte. Ils peuvent être interprétés comme des opérateurs d'inégalité ou dans le cadre d'une déclaration générique. Il me semble qu'une introduction à C# est nécessaire ... une recherche rapide sur Google va générer beaucoup de ressources. –

Répondre

2

Cette est un transtypage, utilisé pour dire au compilateur qu'une variable est d'un type particulier quand ce n'est pas évident. Il aurait pu être utilisé comme ceci:

class Foo { 
    private object _Text_2_; 

    void Method() { 
     ((MSAvalon.Windows.Serialization.ILoaded)_Text_2_).DeferLoad(); 
    } 
} 

En quittant le typecast serait ici provoquer une erreur du compilateur, puisque DeferLoad n'est pas une méthode de object. Vous dites au compilateur ici que vous avez des connaissances spéciales que _Text_2_ est vraiment ce que vous dites.

3

_Text_2_ est casté à un objet/Interface MSAvalon.Windows.Serialization.ILoaded et la méthode DeferLoad est appelée

+0

cela fonctionnera aussi? ** (CastType) _Text_2_.DeferLoad() ** – bcm

+1

Non, mais ce sera: [((CastType) _Text_2 _). DeferLoad();] Si vous le faites dans l'autre sens, vous diffusez le résultat de DeferLoad() ce qui n'est probablement pas ce que tu veux. – twon33

+0

bon point twon33 – bcm

0

Fondamentalement, il est commencé avec ((de sorte que DeferLoad peut être appelé. Je vais illustrer par un exemple.

Disons que vous faites ce qui suit.

object s = "Hello world"; 

s contient désormais une chaîne. Si vous voulez faire de cette chaîne en majuscules à l'aide d'un casting (comme dans votre exemple, je ne peux pas simplement écrire ce

(string)s.ToUpper(); 

ToUpper() ne peut pas être appelé, car il n'est pas valide sur une variable de type ob ject. Si vous réécrivez ceci à

((string)s).ToUpper() 

c'est valide. En raison des crochets, s est d'abord convertie en une chaîne, puis string.ToUpper() est appelée dans la variable.

Notez que dans ce cas (s as string).ToUpper() serait une approche plus propre.

+2

Pourquoi 's (comme chaîne) .ToUpper()' une approche plus propre? Si s n'est pas une chaîne, vous obtiendrez une exception NullReferenceException au lieu de InvalidCastException. Je ne pense pas que ce soit plus propre. – PetPaulsen

+0

Nettoyeur comme dans ce que je pense que le code est plus lisible, car une couche de crochets est supprimée. Pour éviter l'exception, vous pouvez utiliser s.ToString(). ToUpper(), mais si vous vouliez seulement que cela soit fait si s était en fait une chaîne, vous pourriez faire quelque chose comme ceci: string str = s as string; if (str! = Null) { (s comme chaîne de caractères) .ToUpper(); } –

+0

Ce code n'a pas l'air bon dans un commentaire que je vois après l'avoir enregistré, mais vous obtenez le point j'espère :) –

Questions connexes