9
votes

C # équivalent pour le mot clé Visual Basic: 'avec' ... 'fin avec'?

dans Visual Basic, si vous allez modifier plusieurs propriétés d'un seul objet, il y a un avec / end avec instruction: xxx

Je sais que c # peut Faites-le lors de la création d'un nouvel objet: xxx

mais comment puis-je faire si myOjecte est déjà créé (comme ce que fait Visual Basic)?


2 commentaires

Quelques personnes disent que c'est mauvais, mais j'aimerais souligner que les conventions de codage de Microsoft pour VB.NET indiquent que vous devez utiliser le mot-clé lorsque vous effectuez une série d'appels sur un objet - < Un href = "http://msdn.microsoft.com/en-us/library/h63fsef.aspx" rel = "nofollow noreferrer"> msdn.microsoft.com/en-us/library/h63fsef.aspx


Dupliqué possible de avec bloc équivalent en C #?


7 Réponses :


12
votes

vous ne pouvez pas faire cela en C #.

Cette fonctionnalité est spécifique à VB et le plus proche que vous puissiez entrer en C # est l'initialisateur d'objet comme vous décrivez.


0 commentaires

3
votes

Si vous essayez d'éviter beaucoup de taper, vous pouvez donner à votre objet un nom plus court:

var x = myObject;
x.property1 = something;
x.property2 = something2;


5 commentaires

Ouais, et de prendre un pas plus loin, vous pouvez même faire en utilisant (var x = myObject) {/*newline*/x.property1=Quelque chose;}


@Alxandr: Très mauvaise idée, qui appellera jetter à la fin du bloc (et ne compilera même pas pour les types qui ne mettent pas implémenter Idisposable ).


Oo. Bon point. Ma faute. Je pensais juste que cela disposait de la variable "x", mais que la référence pourrait être fatale :-p


Si vous souhaitez que la variable soit hors de portée lorsque vous avez terminé, vous pouvez simplement entourer le code dans des accolades bouclées pour créer une nouvelle portée.


Éviter beaucoup de dactylographie, vraiment? Avec le kickass intellisense que nous avons ?! Tout est question de lisibilité imo.



6
votes

Que diriez-vous de cela? XXX


3 commentaires

Faites une méthode d'extension! Ensuite, vous pouvez faire comme détaillée.with (o => {o.prop1 = 4})


Et btw. +1 pour la créativité :-)


Remarque: Si vous utilisez Cadenza, Calock rempli de belles extensions .NET, vous obtenez une méthode qui a exactement cette implémentation: Gitorious.org/cadenza/cadenza/blobs/master/src/cadenza/caden za / ...



3
votes

pourquoi ne pas c # avoir vb.net's 'avec "opérateur?

Beaucoup de gens, y compris les concepteurs de langue C #, croient que "avec" nuit souvent à la lisibilité, et c'est plus une malédiction qu'une bénédiction. Il est plus clair de déclarer une variable locale avec un nom significatif et d'utiliser cette variable pour effectuer plusieurs opérations sur un seul objet, qu'il s'agit d'un bloc avec une sorte de contexte implicite.

par @jon Skeet


2 commentaires

... et d'autres personnes croient que la déclaration de VB "avec" est une fonctionnalité utile qui offre une sémantique qui n'est pas aussi commodément réalisée via d'autres moyens.


Intéressant qu'ils appellent la syntaxe une malédiction puis la répliquent presque dans la syntaxe d'initialisation de l'objet ...



1
votes

vb.net comprend certaines des défauts de conception de VB6 pour des raisons de compatibilité en arrière. Tandis que JavaScript a la même faille de conception (en effet un pire encore pire, comme son avec conduit à des constructions plus ambiguës), la plupart des autres langues C-syntaxes ne le font pas, il n'y a donc pas d'avantage de compatibilité en arrière dans l'ajout à c #.


2 commentaires

En fait, il existe un avantage distinct d'avoir avec en JavaScript. Cela vous permet d'introduire une nouvelle portée à vos fonctions!


La déclaration «avec» dans VB, lorsqu'elle est utilisée avec des structures, offre une sémantique qui n'est pas commodément disponible dans C. Étant donné que VB 'avec »utilise une période de premier plan pour éviter toute ambiguïté, je ne sais pas pourquoi vous considérez comme une faille de conception ?



0
votes

Si l'expression "avec" est un type de classe, l'instruction "avec" est équivalente à la création d'une nouvelle variable temporaire de ce type, initialisée à l'expression "avec" et précédant chacun ".". avec cette variable. S'il s'agit d'un type de structure, cependant, les choses sont plus compliquées. Considérez le code (évidemment pas comme si on n'écrirait normalement quelque chose, mais écrit comme il s'agit de faire un point: xxx

la déclaration "avec" se verrouille efficacement une référence à myPoints (n). Même si les mycoints sont modifiés par un autre tableau ou que N est modifié, la référence verrouillée pointera toujours sur le même élément du même tableau que lorsqu'il a été exécuté lorsqu'il a été exécuté. Si l'on a déclaré une variable locale P de type de type et attraper des myocoints (n), puis écrivez à px et à py, les écrivies ne toucheraient que la copie locale P, plutôt que de mettre à jour la matrice. Pour obtenir une sémantique similaire dans C #, il faudrait soit utiliser des variables locales pour contenir des mycocations et N, ou d'autres placer le contenu de l'instruction avec une fonction anonyme qui a un paramètre de type réfé. Pour éviter de créer une fermeture au moment de l'exécution, la fonction anonyme doit également accepter, probablement par référence, toutes les variables locales. Il aura besoin de la portée extérieure.


0 commentaires

1
votes

@mark Byers Répondre est bon mais la variable x vivra après la définition des propriétés. . Et vous ne pouvez pas utiliser Name x à nouveau (dans le même bloc).

Essayez ceci ( et l'objet doit être le type de référence dans cet exemple ): xxx


0 commentaires