29 Sep 2007 |
| |||
| Niet getest met Visual Studio 2008.
Iets wat we toch vrij veel doen als developers is nieuwe classes aanmaken. Dit voornamelijk gescheiden in aparte bestanden. Nu ga ik er eigenlijk ook vanuit van jullie ook allemaal gebruik maken van Visual Studio en dat jullie ook voor sommige projecten Visual Studio 2005 gebruiken. Het laatste waar ik ook vanuit ga is dat jullie voor sommige projecten C# gebruiken. Voldoe je niet aan deze punten, dan is het misschien toch verstandig om even verder te lezen omdat je er wellicht in de toekomst nog mee in aanraking komt. Een nieuwe class
Het aanmaken van een nieuwe class in Microsoft's Visual Studio 2005 is eenvoudig. Alleen heeft Visual Studio 2005 in mijn ogen iets merkwaardigs. Bij het toevoegen van een nieuwe class word deze het bestand voor jou aangemaakt, indien nodig toegevoegd aan je project en er word voor jou een mooie lege class gegenereerd met de bestandsnaam die jij hebt opgegeven zonder extensie. Dit is uiterst handig en scheelt je toch weer wat tik werk. Laten we is kijken naar de code die voor ons word gegenereerd. Gegenereerde codeAls we een class toevoegen met de naam MyClass, dan zal er devolgende code worden gegenereerd: using System; using System.Collections.Generic; using System.Text; namespace ClassExample { class MyClass { } }* De namespace kan natuurlijk verschillen De scope van onze classAls we nu kijken naar de gegenereerde code dan zie je dat onze class geen access modifier bevat. Dit houd in de default access modifier geld, voor een class is dat de internal modifier en voor een nested class private volgende de language specifications (ยง10.2.4). De scope van onze class is nu internal. Dit houd in dat deze alleen voor files binnen dezelfde assembly toegankelijk is. Dit is natuurlijk prima, er word dus voor de meest strikte modifier gekozen maar in de meeste gevallen wil je de public modifier gebruik. Als je met een API bezig bent zul je veel public classes willen gebruiken, je zult elke keer de public modifier zelf moeten toevoegen. Dit is geen groot probleem, maar het erriteerd soms wel. In Visual Studio 2002/2003 was werd de public modifier genereerd. Dit beviel mij persoonlijk beter. Zeker omdat wij als volwassen programmeurs zelf wel een anderen modifier aan hangen als dit nodig is. TemplatesDe code die gegenereerd word bij het aanmaken van een nieuwe class moet natuurlijk ergens vandaan komen. Het lijkt mij stug als dit hardcoded is. Wat blijkt nou, ze komen uit template bestanden. Dit betekend dus dat wij er voor kunnen zorgen dat we bij het aanmaken van een nieuwe class wel de public modifier zijn in de gegenereerde code! Goed nieuws :)De directory met de template's vind je onder:
In deze directory vind je de templates die Visual Studio gebruikt bij het genereren van de code voor nieuwe files. Wij hadden het over de het ontbreken van de access modefier bij het aanmaken van een nieuwe class, dus wij gaan class.zip aanpassen. De Template class.zipAls we het template bestand, wat allemaal zip archives zijn, class.zip pakken. Zien wij net als in alle templates in de directory twee bestanden. Twee bestanden met de namen: class.cs en class.vstemplate. Het laatste bestand laten we ongedeerd, het gaat om om de class.cs, deze willen we aanpassen.
Als we class.cs openen zien we devolgende code: using System; using System.Collections.Generic; using System.Text; namespace $rootnamespace$ { class $safeitemrootname$ { } } Het is vrij simpel, $rootnamespace$ word vervangen door je root namespace en $safeitemrootname$ door je class naam. Simpel toch? We kunnen hier alles in zetten wat we willen, maar wij willen er alleen maar een public access modifier bij: using System; using System.Collections.Generic; using System.Text; namespace $rootnamespace$ { // Thanks to born2code.net we // have a public modifier by // default now! public class $safeitemrootname$ { } } Als we class.cs aangepast hebben in de archive en we maken nu een nieuwe class aan met de naam MyClass dan word devolgende code gegenereerd: using System; using System.Collections.Generic; using System.Text; namespace ClassExample { // Thanks to born2code.net we // have a public modifier by // default now! public class MyClass { } }* De namespace kan natuurlijk verschillen Known issueNatuurlijk gaat het niet altijd zo makkelijk. Het kan zijn dat jij een template hebt aangepast maar dat er nog steeds dezelfde oude code word gegenereerd. Wees niet bang, hier is een oplossing voor. In de template root (ItemTemplates directory) staat een directory met de naar ItemTemplatesCache. Deze naam doet ons al vermoeden dat het gaat om de cache van de item templates ;) Nu denk je heel slim te zijn en je template map uit deze cache te verwijderen of de ItemTemplatesCache map weg te halen, NIET DOEN! Als je dit namelijk wel doet komt Visual Studio met de melding dat hij het bestand niet in de cache kan vinden, en nee opnieuw opstarten werkt ook niet. Wat je het beste kunt doen is de template (class.zip) die je hebt aangepast even uitpakken in de cache directory en je bent klaar. Geen restart voor nodig zelfs. Het uitvoeren van devenv /InstallVsTemplates zorgt ervoor dat de templates opnieuw worden ingeladen. Bij mij werkte deze optie helaas niet, maar voor vele zal dit ook een oplossing zijn die een stuk eenvoudiger is dan zelf stuff uitpakken. NawoordJe weet nu dus hoe je de templates kunt aanpassen voor nieuwe items! Doe er wat leuks mee, want misschien wil jij dingen default in je app.config hebben of moet je about box er standaard anders uitzien. Laat mij weten wat jij er van gemaakt hebt! Related resources
Set as favorite
Bookmark
Email This
Trackback(0)
Commentaar (0)
![]() Schrijf commentaar
|
Bedankt voor je schitterende presentatie. Ik heb niets dan positieve geluiden gehoord.
Peter Criellaard
Microsoft
Eindelijk een presentatie waarmee ik ook iets mee kan in de praktijk!
Dennis Schuuring
Max BV
Bedankt voor de presentatie, het was voor mij 1 van de betere momenten van die dag!
Henri Koppen
Arcenus