Entity Framework 6 (EF6) är mycket enkelt att komma igång med. För att få tillgång till aktuell version, använd Nuget-paketet EntityFramework. Den här bloggposten visar det minsta man behöver veta för att komma igång med EF6 i sitt program. Install-Package EntityFramework Dessutom behöver du ha en tom databas att jobba mot. I detta exempel antar jag att databasen heter EfTest. Anslutningssträngen lagras i konfigurationsfilen. I mitt fall är det en vanlig Console Application. <connectionStrings> <add name=”EfTest” providerName=”System.Data.SqlClient” connectionString=”Data Source=XXX;Initial Catalog=EfTest;Integrated Security=True” /> </connectionStrings> Nästa steg är att skapa DbContext-objektet. Denna ärver från System.Data.Entity.DbContext. Basklassen behöver veta vilken anslutningssträng som ska användas. Antingen skickar man in själva anslutningssträngen, eller så hänvisar man till ett namn. De tabeller som ska användas beskrivs av[…]

Om du vill bygga ett spel med Monogame som 1) körs i fullsärmsläge och 2) har en låg virtuell upplösning, typ 320 x 200 pixlar, så finns en enkel lösning. Istället för att rendera spelet på din backbuffer, så renderar du till en render target som är just 320 x 200 pixlar stor. För att åstadkomma detta, skapa en ny property i ditt spel, av typen RenderTarget2D. private RenderTarget2D renderTarget { get; set; } I konstruktorn, givet att vi befinner oss i release-kompileringen, skapar man en backbuffer som är lika stor som skärmen. graphics = new GraphicsDeviceManager(this); #if DEBUG ScreenWidth = 640; ScreenHeight = 400; graphics.PreferredBackBufferWidth = ScreenWidth; graphics.PreferredBackBufferHeight = ScreenHeight; graphics.IsFullScreen = false; #else ScreenWidth = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width; ScreenHeight =[…]

När man bygger retrospel med en upplösning på omkring 320 x 200 pixlar, vill man gärna skala upp spelet så att sprites och andra objekt inte blir så små på en modern skärm. För den som programmerar Monogame finns flera lösningar. Jag tycker att den enklaste metoden är att använda ett transform matrix. När jag debuggar mitt spel, tycker jag att en uppskalning på 3 x 3 är rätt lämplig, vilket innebär att ett fönster på 960 x 600 pixlar är lämpligt. Detta är spelets konstruktor, spelet har kompletterats med en medlemsvariabel vid namn transformMatrix av typen Matrix. graphics.PreferredBackBufferWidth = 960; graphics.PreferredBackBufferHeight = 600; graphics.IsFullScreen = false; transformMatrix = Matrix.CreateScale(960 / 320, 600 / 200, 1.0f); I skarpt läge låter jag[…]

Jag har börjat arbeta med ett datorspel i kategorin roguelike. Varje spel ska vara unikt, så kartan genereras när en användare spelar spelet. Vid uppstart skapar jag en labyrint som sen används som kontur för rummen som genereras efter behov. De rum som spelaren inte besöker behöver man trots allt inte hålla i RAM, men jag vill ha konturen färdig för att kunna ha lite kontroll över kartans kvalité.   Totalt okunnig om labyrintalgoritmer läste jag igenom Wikipedias artikel om recursive backtracking som i korthet går ut på följande: 1. Utgå från den cell som ska vara startpunkten, C.   2. Om C inte är vald sedan tidigare, plocka bort en slumpvis utvald vägg på C. Följ den nyskapade öppningen och[…]

Till en viss grad har man kunnat skapa lokala funktioner i C# under en tid. public void DoSomething() { Func<int, int> d = (x) => x * 2; for (var i = 1; i <= 8; i++) Console.WriteLine(d(i)); } I C# 7 kan man skapa fullvärdiga funktioner i en annan funktion. Det enda som egentligen skiljer en lokal funktion från en medlemsfunktion (eller en static) är att lokala funktioner inte har någon angiven synlighet, eftersom det inte är relevant. public void DoSomething() { int d(int x) => x * 2; for (var i = 1; i <= 8; i++) Console.WriteLine(d(i)); } Fördelen med riktiga lokala funktioner är att det ger tillgång till parameterarrayer, referensparametrar, utparametrar och generics, alltså sådant som inte[…]

Om jag vill skapa en funktion som skickar tillbaka två värden, kan det lösas med en tuple. I .NET Framework är tuples implementerat som en generisk klass. Denna funktion skickar tillbaka en int och en string: public static Tuple<int, string> DoSomething() { return Tuple.Create(10, “Hello”); } Ett anrop som tar emot svaren skulle kunna se ut så här. I detta fall är response av typen Tuple<int, string>, vilket innebär att Item1 är en int och Item2 en string. var response = DoSomething(); Console.WriteLine(response.Item1); //10 Console.WriteLine(response.Item2); //”Hello” Eftersom C# 7 har inbyggt stöd för tuples, behöver jag inte hänvisa till klassen Tuple. Det går helt enkelt att deklarera fler returer på en funktion. Samma funktion i C# 7 kan se ut så[…]

This example shows how to list the method invocations in a C# file. This is the file that will be read: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { public class MyClass { public MyClass() { Console.WriteLine(“Hello.”); DoSomething(); DoSomethingElse(); } private void DoSomething() { } private void DoSomethingElse() { } } } To install CodeSearchTree in your Visual Studio project, type Install-Package CodeSearchTree in the package manager console. Your project must use .NET Framework 4.6 or higher. The path to the first method invocation is ns/cls/constructor/block/expression/invocation, but since each invocation is located under an expression node, we will iterate through those. The code will list the three calls made in the constructor of the example class above. //Load[…]

To parse T-SQL from C#, add a reference to the following libraries (listed under Extensions, not under Framework): Microsoft.Data.Schema.ScriptDom Microsoft.Data.Schema.ScriptDom.Sql My examples imports the following namespaces: using System; using System.Collections.Generic; using System.Linq; using Microsoft.Data.Schema.ScriptDom; using Microsoft.Data.Schema.ScriptDom.Sql; using System.IO; This code shows how to parse a boolean expression: //Parse var p = new TSql100Parser(false); IList<ParseError> err; var sql = “(a > 10) and (i < 10)”; var exp = p.ParseBooleanExpression(new StringReader(sql), out err); //Errors? Empty if none. Console.WriteLine($”{err.Count} errors.”); err.ToList().ForEach(x => Console.WriteLine( $”Error \”{x.Message}\” at line {x.Line}.”)); //Result. Null if errors. if (!(exp == null)) exp.ScriptTokenStream.ToList().ForEach(x => Console.WriteLine( $”Token type: {x.TokenType}, source: {x.Text}”)); If you want to parse a complete Transact SQL program, call the ParseStatementList function instead of the ParseBooleanExpression[…]