Vous apprécierez les deux sucres syntaxiques suivants: et p> clairement le premier exemple dans chaque cas est plus lisible. . Y a-t-il un moyen de définir ce genre de chose moi-même, soit dans la langue C #, ou dans l'IDE? La raison pour laquelle je demande est qu'il existe de nombreux usages similaires (du long type) qui en bénéficieraient, par exemple. Si vous utilisez ReaderWriterLocksLim, vous voulez quelque chose de très semblable similaire. P> EDIT 1: strong> P> On m'a demandé de donner un exemple, alors je suis donc " Ça donner un go: p> Bien sûr, vous devez donner des pensées quant à la manière d'utiliser les tryentReadLocks et ces types de choses avec des retours. Mais je suis sûr que vous pourriez penser à quelque chose. P> p>
10 Réponses :
Non, il n'y a aucun moyen de définir vos propres mots-clés. Celles-ci sont définies par la langue et sont construites dans le compilateur pour interpréter vers IL. Nous n'avons pas encore atteint ce niveau d'abstraction! P>
Il suffit de regarder à quel point tout le monde est excité quand des choses comme Avec cela à l'esprit, éditez votre message pour montrer ce que vous souhaitez que la syntaxe soit pour le var code> et
dynamique code> sont introduites. P>
ReaderWriterLockSlim code> exemple. Il serait intéressant de voir. P>
Je suppose que vous recherchez des directives de préprocesseur, mais c # Ne supporte pas ces . Le plus proche de celui-ci pourrait être Visual Studio Snippets A >, que vous pouvez Design vous-même . P>
Malheureusement pas. Afin de supporter ce compilateur C # aurait besoin d'être plus extensible pour l'utilisateur final. Cela comprendrait être capable de définir vos propres mots-clés et d'avoir une assistance macro, etc.
Cependant, ce que vous pouvez faire est de créer des méthodes qui ont au moins un peu une sensation similaire telle que celle-ci: (EXEMPLE CONTREFÉ D'UN REIMPLEMENTATION DE Mot-clé de verrouillage dans le code de l'utilisateur) P>
lockObject.WithinLock(()=> { DoWork(); //DoOtherStuff });
Pas exactement, mais vous pouvez utiliser un délégué d'action pour obtenir quelque chose de fermeture: et l'utiliser comme ceci: p> Notez qu'il existe certaines limitations avec cela. Vous ne pouvez pas avoir une déclaration de retour significatif dans les nouveaux accolades, par exemple. Merci à des fermetures, vous serez au moins en mesure d'utiliser des variables locales. P> P>
J'aime ça, je pourrais essayer d'écrire cela en une classe d'extension pour mes usages RWLSLIM.
J'utilise largement ce modèle et ça marche vraiment bien. Vous pouvez faire des trucs comme T FINAY
Je comprends qu'il y aura une grosse poussée vers ce type de flexibilité dans la prochaine version de Visual Studio. p>
sur .NET Rocks, Anders Hejlsberg a récemment déclaré que l'un des principaux thèmes de la Suivant Visual Studio Libération (2012?) Sera "compilateur en tant que service" et, étant donné que d'autres personnes ont laissé entendre que cela ouvrira beaucoup de portes pour l'extension linguistique et l'intégration plus stricte avec les DSLS (langages spécifiques à un domaine). p>
Pour le moment, vous pouvez réellement faire de jolies trucs soignées avec DSLS, notamment la création de vos propres mots-clés, bien que ce soit encore un peu trop maladroit à mon avis. Si vous êtes intéressé, consultez Cet article sur la conception de DSLS dans BOO A >. p>
Cela pourrait vous souffler un peu. P>
Vous ne pouvez pas définir les constructions comme celle-ci directement, mais il existe des moyens de créer des modèles concis similaires:
Vous pouvez définir des classes qui implémentent Idisposable pour encapsuler ce type de sémantique d'utilisation du bloc. Par exemple, si vous avez eu une classe qui encapsulée en acquérant une lectureWriterLocksLIM (acquérir sur la construction, la libération de mise à disposition), vous pouvez créer une propriété sur votre classe qui construit l'instance, qui donne une syntaxe comme celle-ci: P>
private void InReadLock(Action action) { //Acquires the lock and executes action within the lock context }
Je pensais que Idisposable était précisément pour des ressources qui nécessitent une libération explicite. Pourquoi pensez-vous que ce n'est pas vrai d'une serrure?
Personnellement, je pense que c'est une utilisation raisonnable du modèle, mais il y a une différence importante. La plupart des classes indisposables mettent également en œuvre un finaliseur pour leurs ressources non gérées, ce qui signifie que les ressources non gérées seront éventuellement libérées. Si vous ne disposez pas de disposer d'un objet qui détient une serrure de thread jusqu'à ce que je puisse appeler, vous avez probablement créé une impasse. Ceci est sans danger plus dangereux. Il y a aussi un cas extrêmement rare à .NET 3.5 et plus tôt où le dispositif ne sera pas appelé si une filetabortException est lancée au bon point.
De nombreuses classes iDisposables ne tiennent pas directement une ressource non gérée. Ils n'ont donc pas de finaliste. Votre exemple est plus raisonnable que vous ne le suggérez.
Il n'y a pas de fonctionnalité native qui fait ce que vous voulez. Cependant, vous pouvez exploiter le à l'aide de la relève code> simplement en implémentant
Idisposable code>.
public class Program
{
private static SharedLock m_Lock = new SharedLock();
public static void SomeThreadMethod()
{
using (m_Lock.Acquire())
{
}
}
}
public sealed class SharedLock
{
private Object m_LockObject = new Object();
public SharedLock()
{
}
public IDisposable Acquire()
{
return new LockToken(this);
}
private sealed class LockToken : IDisposable
{
private readonly SharedLock m_Parent;
public LockToken(SharedLock parent)
{
m_Parent = parent;
Monitor.Enter(parent.m_LockObject);
}
public void Dispose()
{
Monitor.Exit(m_Parent.m_LockObject);
}
}
}
Personnellement, j'abuse 1 sup> en utilisant tellement code> pour cela que j'ai un
Dispososehelper code> classe pour ceci:
using (new DisposeHelper(() => rw1.EnterReadLock(), () => rw1.ExitReadLock())) {
// do work
return value;
}
Comme d'autres personnes ont déjà dit, Idisposable code> peut être maltraité pour créer le Notion d'une portée dans votre code. Il peut même soutenir la nidification. P>
La classe magique: utilisation: p>
Vous pouvez imiter une charge de choses en utilisant le constructeur comme "pré-bloc" et le disposer () comme fonction "post-block".
Pouvez-vous clarifier ce que vous entendez par ceci?
Voilà: Stackoverflow.com/Questtions/2882983/...