Grundkurs i C-Sharp - Namnrymder
Förord
Det tillhör inte det ovanliga att man utvecklar och distribuerar så kallade klassbibliotek som andra programmerare kan ta del av. Detta är helt enkelt en samling klasser, gränssnitt, strukturer m.m. som man kompilerar till en dll fil som man sedan kan använda i sitt eget program. Om du funderar på det så inser du själv att Microsoft .NET plattformen är uppbyggt på samma sätt. Microsoft skickar med ett klassbibliotek som tillsammans uppgör det som kallas för .NET Framework Class Library.- System.Configuration.Install.dll
- System.Data.dll
- System.Design.dll
- System.DirectoryServices.dll
- System.dll
- System.Drawing.Design.dll
- System.Drawing.dll
- System.EnterpriseServices.dll
- System.EnterpriseServices.Thunk.dll
- System.Management.dll
- System.Messaging.dll
- System.Runtime.Remoting.dll
- System.Runtime.Serialization.Formatters.Soap.dll
- System.Security.dll
- System.ServiceProcess.dll
- System.Web.dll
- System.Web.Mobile.dll
- System.Web.RegularExpressions.dll
- System.Web.Services.dll
- System.Windows.Forms.dll
- System.XML.dll
Innehåll
»»
»
»
»
»
Relaterade artiklar
» Grundkurs i C-Sharp - Arv» Grundkurs i C-Sharp - Gränssnitt
» Grundkurs i C-Sharp - Introduktion
» Grundkurs i C-Sharp - Polymorphism
» Grundkurs i C-Sharp - Statiska medlemmar
» Grundkurs i C-Sharp - Strukturer
» Grundkurs i C-Sharp - Undantagshantering
» Grundkurs i C-Sharp - Åtkomstmodifiering
» Grundkurs i C-Sharp - Överlastning
Problemet med att man samlar ihop relaterade klasser, gränssnitt, strukturer m.m. i ett klassbibliotek är att det finns en stor risk att t.ex. två klasser i två skilda klassbibliotek får samma namn. Hur skulle man då kunna tala om för sitt program vilken av de två klasserna man faktiskt vill använda?
Det är här så kallade namnrymder kommer in i bilden. Detta är ett sätt att unikt identifiera t.ex. klasser med samma namn. Man skapar en namnrymd genom att ge det ett namn, svårare än så är det inte
För att skapa en namnrymd använder man sig av nyckelordet namespace [1] i C-Sharp. För att för lite bättre förståelse för vad en namnrymd är och hur man skapar dem så ta en titt på följande exempel.
Man använder sig av punktnotation för att kunna skapa en hierarkisk struktur inom sin namnrymd. Detta är något som jag rekommenderar er att ta användning av eftersom det är en mycket praktiskt, och även mycket vanligt, sätt att gruppera relaterade klasser, gränssnitt, strukturer m.m. Så låt oss t.ex. föreställa oss att vi kommer att skriva en samling av klasser som har med att hämta och lagra data och att vi kommer att skiva en samling klasser som har med ljudhantering att göra.
Det mest lämpliga är att välja två samlingsnamn för de grupper av klasser som man kommer att skriva och sen skapa två namnrymder för dem.
Detta kanske verkar som att man skapar en massa extra arbete som man inte kommer att ha någon nytta av, men det är faktiskt så att det är precis tvärtom. Det finns två enormt bra anledningar till att använda sig av namnrymder. Det första är, som jag tidigare nämnde, att man undviker problem om två klasser har samma namn. För enkelheten föreställ dig att vi både behöver en klass med namnet Test för att arbete med data modifiering och en med samma namn för att arbete med ljud hantering.
Nu är det fullt möjligt att skapa objekt av de två olika klasserna fast de har samma namn. Följande exempel visar hur man gör detta med så kallade fullt kvalificerat namn (fully qualified name).
Som du kan se var det inga problem att skapa två olika objekt och skilja på dem, tackvare att vi kvalificerade klassens namn med hela sökvägen till den i namnrymden.
Den andra anledningen till att använda sig av namnrymder är att det är mycket lättare att hitta de klasser som man är intresserad av, genom att man vet i vilken namnrymd de befinner sig.
Det är viktigt att veta att man bara kan skapa objekt inom samma namnrymd om man inte använder sig av fullt kvalificerade namn. Så fort man vill skapa ett objekt av t.ex. en klass som ligger i en annan namnrymd än den där man befinner sig i så måste man använda fullt kvalificerade namn.
Skriver man ett lite större program, eller att man grupperar sina klasser m.m. i väldigt specifika namnrymder, så kan de oftast bli så att det blir krångligt ett skapa objekt med hjälp av att använda fullt kvalificerade namn. Det är lätt att man får långa namn att hålla reda på och detta kan även göra att programmerings koden blir oläslig.
Det finns ett enkelt sätt att undvika detta på och det är genom att använda sig av nyckelordet using [2]. Med hjälp av detta kan man säga till sitt program att komma ihåg en sökväg till en namnrymd så man inte behöver använda sig av fullt kvalificerade namn för att skapa ett objekt av något i den namnrymden.
Betrakta följande kod där vi i roten på namnrymden MySpace skapar en klass med namnet Controller som i sin tur har ett provat fält av klassen Test som finns i namnrymden MySpace.Data.
Vi kan förenkla detta genom att skapa en genväg till MySpace.Data namnrymden med hjälp av using nyckelordet. Gör vi detta blir koden på följande sätt.
Som ni ser är detta ett mycket enklare och smidigare sätt att komma åt den information som ligger i en namnrymd. Tänk bara på att om man är tvungen att använda två klasser med samma namn från olika namnrymder så kan man inte skapa en genväg till båda namnrymderna samtidigt. Den bästa läsningen till detta är att skapa en genväg som ligger nivån högre upp än klasserna. Så om vi modifierar vår Controller klass så den använder Test klassen från båda namnrymderna så är detta det mest lämpliga sättet.
Här skapar vi en genväg som ligger en nivå upp till de båda klasserna och kvalificerar sen klassnamnen med den sista nivån i namnrymden.
Man har ytterligare en möjlighet att använda sig av när man använder namnrymder och det är alias [2]. Detta är inte något som är så väldigt vanligt, men det betyder inte att det inte finns tillfällen när det är användbart. Ett alias är ett sätt skapa en genväg till en namnrymd.
Betrakta följande exempel där vi skapar ett alias som heter DataStuff och som pekar till vår MySpace.Data namnrymd.
Detta är givetvis mest användbart om man har långa sökvägar i sin namnrymd, eller om man vill öka läsbarheten i sitt program ytterligare. Det kan vara praktiskt att använda i större projekt där det är flera programmerare inblandare, för att underlätta när man skall sätta sig in i någon annans kod.
[1] Namespace
[2]Using Directive
Namnrymder kan användas för att lösa många problem som man annars skulle ha fått väldigt svårt att lösa, speciellt om man använder sig av klassbibliotek som är skriven av någon annan och detta är väldigt vanligt att man gör. Ta dig tiden att planera en bra struktur för din namnrymd eftersom detta kommer att underlätt utvecklingen av ditt program.
Andreas bor i Helsingborg där han studerar Software Engineering vid Lunds Tekniska Högskola. Han har många års erfarenhet inom både Windows samt internet baserad programmering inom en rad olika programmeringsspråk. Ni kan komma i kontakt med Andreas på andreas@selfinflicted.org.
Det är här så kallade namnrymder kommer in i bilden. Detta är ett sätt att unikt identifiera t.ex. klasser med samma namn. Man skapar en namnrymd genom att ge det ett namn, svårare än så är det inte
Namespace
För att skapa en namnrymd använder man sig av nyckelordet namespace [1] i C-Sharp. För att för lite bättre förståelse för vad en namnrymd är och hur man skapar dem så ta en titt på följande exempel.
namespace MySpace
{
// Här skriver man t.ex. sina klasser
// gränssnitt m.m.
}
Man använder sig av punktnotation för att kunna skapa en hierarkisk struktur inom sin namnrymd. Detta är något som jag rekommenderar er att ta användning av eftersom det är en mycket praktiskt, och även mycket vanligt, sätt att gruppera relaterade klasser, gränssnitt, strukturer m.m. Så låt oss t.ex. föreställa oss att vi kommer att skriva en samling av klasser som har med att hämta och lagra data och att vi kommer att skiva en samling klasser som har med ljudhantering att göra.
Det mest lämpliga är att välja två samlingsnamn för de grupper av klasser som man kommer att skriva och sen skapa två namnrymder för dem.
namespace MySpace.Data
{
// Här skriver man sina klasser
// för att manipulera data.
}
namespace MySpace.Sound
{
// Här skriver man sina klasser
// för att manipulera ljud.
}
Detta kanske verkar som att man skapar en massa extra arbete som man inte kommer att ha någon nytta av, men det är faktiskt så att det är precis tvärtom. Det finns två enormt bra anledningar till att använda sig av namnrymder. Det första är, som jag tidigare nämnde, att man undviker problem om två klasser har samma namn. För enkelheten föreställ dig att vi både behöver en klass med namnet Test för att arbete med data modifiering och en med samma namn för att arbete med ljud hantering.
namespace MySpace.Data
{
class Test()
{
}
}
namespace MySpace.Sound
{
class Test()
{
}
}
Nu är det fullt möjligt att skapa objekt av de två olika klasserna fast de har samma namn. Följande exempel visar hur man gör detta med så kallade fullt kvalificerat namn (fully qualified name).
DataObj a = new MySpace.Data.Test();
SoundObj b = new MySpace.Sound.Test();
Som du kan se var det inga problem att skapa två olika objekt och skilja på dem, tackvare att vi kvalificerade klassens namn med hela sökvägen till den i namnrymden.
Den andra anledningen till att använda sig av namnrymder är att det är mycket lättare att hitta de klasser som man är intresserad av, genom att man vet i vilken namnrymd de befinner sig.
Det är viktigt att veta att man bara kan skapa objekt inom samma namnrymd om man inte använder sig av fullt kvalificerade namn. Så fort man vill skapa ett objekt av t.ex. en klass som ligger i en annan namnrymd än den där man befinner sig i så måste man använda fullt kvalificerade namn.
Using
Skriver man ett lite större program, eller att man grupperar sina klasser m.m. i väldigt specifika namnrymder, så kan de oftast bli så att det blir krångligt ett skapa objekt med hjälp av att använda fullt kvalificerade namn. Det är lätt att man får långa namn att hålla reda på och detta kan även göra att programmerings koden blir oläslig.Det finns ett enkelt sätt att undvika detta på och det är genom att använda sig av nyckelordet using [2]. Med hjälp av detta kan man säga till sitt program att komma ihåg en sökväg till en namnrymd så man inte behöver använda sig av fullt kvalificerade namn för att skapa ett objekt av något i den namnrymden.
Betrakta följande kod där vi i roten på namnrymden MySpace skapar en klass med namnet Controller som i sin tur har ett provat fält av klassen Test som finns i namnrymden MySpace.Data.
namespace MySpace
{
class Controller()
{
private MySpace.Data.Test myTester ;
public Controller()
{
myTester = new MySpace.Data.Test();
}
}
}
Vi kan förenkla detta genom att skapa en genväg till MySpace.Data namnrymden med hjälp av using nyckelordet. Gör vi detta blir koden på följande sätt.
using MySpace.Data;
namespace MySpace
{
class Controller()
{
private Test myTester ;
public Controller()
{
myTester = new Test();
}
}
}
Som ni ser är detta ett mycket enklare och smidigare sätt att komma åt den information som ligger i en namnrymd. Tänk bara på att om man är tvungen att använda två klasser med samma namn från olika namnrymder så kan man inte skapa en genväg till båda namnrymderna samtidigt. Den bästa läsningen till detta är att skapa en genväg som ligger nivån högre upp än klasserna. Så om vi modifierar vår Controller klass så den använder Test klassen från båda namnrymderna så är detta det mest lämpliga sättet.
using MySpace;
namespace MySpace
{
class Controller()
{
private Data.Test DataObj;
private Sound.Test SoundObj;
public Controller()
{
DataObj = new Data.Test();
SoundObj = new Sound.Test();
}
}
}
Här skapar vi en genväg som ligger en nivå upp till de båda klasserna och kvalificerar sen klassnamnen med den sista nivån i namnrymden.
Alias
Man har ytterligare en möjlighet att använda sig av när man använder namnrymder och det är alias [2]. Detta är inte något som är så väldigt vanligt, men det betyder inte att det inte finns tillfällen när det är användbart. Ett alias är ett sätt skapa en genväg till en namnrymd. Betrakta följande exempel där vi skapar ett alias som heter DataStuff och som pekar till vår MySpace.Data namnrymd.
using DataStuff = MySpace.Data;
using MySpace.Sound;
namespace MySpace
{
class Controller()
{
private DataStuff.Test DataObj;
private Test SoundObj;
public Controller()
{
DataObj = new DataStuff.Test();
SoundObj = new Test();
}
}
}
Detta är givetvis mest användbart om man har långa sökvägar i sin namnrymd, eller om man vill öka läsbarheten i sitt program ytterligare. Det kan vara praktiskt att använda i större projekt där det är flera programmerare inblandare, för att underlätta när man skall sätta sig in i någon annans kod.
Rekommenderad läsning
[1] [2]
Johan Dehn
Äntligen någon som på ett enkelt sätt kunde förklara namndrymder. Tack!