Whidbey (C# 2.0): Farbige Console, Generics, Anonyme Funktionen
Feb
3
Von:
03.02.2004
Hier habe ich ein paar Kleinigkeiten mit Whidbey bzw. C# 2.0 ausprobiert.
Weil ich doch im Projekt noch nicht damit arbeiten kann, wollte ich zumind. noch einmal ein paar Features anwenden.
1.) Kann die Console wieder bunt :)
2.) Kann man nun mit Generics (in C++ templates) arbeiten. Zur Definition wird anstatt eines bekannten Types ein Platzhalter verwendett. Diese Technik hat auch den Vorteil das Listen, die Value Typen speichern deutlich schneller werden, weil das sog. boxing beim einfügen entfällt.
3.) Anonyme Funktionen: An dieser Stelle eigentlich nur verwendet um Sie zu verwenden. Das macht schon Spass. Dafür aber hier wenig Sinn.
Das ganze gibt eine Sinus Kurve auf der Console Bunt aus und animiert auf Tastendruck die Farben und den Offset :)
Die Tage schreibe ich noch was wg. Serialisieren von ArrayListen.
Eine Sache noch: Der Achim hat was tolles rausgefunden. Man kann einfach jeden beliebigen Dateityp ins Projekt nehmen und als Embedded Resource kompilieren. Ich hoffe er stellt hier mal die zwei Zeilen für den Zugriff hin, sonst muss ich das noch machen.
using System;
using System.Collections.Generic;
namespace Test
{
///
/// Summary description for Class1.
///
class SimpleAnonymousFunctionsAndGenerics
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main(string[] args)
{
SimpleAnonymousFunctionsAndGenerics c = new SimpleAnonymousFunctionsAndGenerics();
List<ConsoleColor> listColors = new List<ConsoleColor>();
foreach (ConsoleColor color in Enum.GetValues(typeof(ConsoleColor))) {
listColors.Add(color);
}
Console.CursorVisible = false;
Console.BackgroundColor = ConsoleColor.DarkBlue;
Console.ForegroundColor = ConsoleColor.White;
string exitString = "PRESS ESCAPE TO EXIT";
Console.SetCursorPosition((Console.WindowWidth - exitString.Length) / 2, 0);
Console.Write(exitString);
ConsoleKeyInfo ret;
int xOffset = 0;
while ((ret = Console.ReadKey()).Key != ConsoleKey.Escape)
{
Console.BackgroundColor = listColors[new Random().Next(listColors.Count)];
c.Fillbackground(delegate (float x, float y) {
Console.SetCursorPosition((int) x, (int) y);
Console.Write(" ");
});
Console.BackgroundColor = listColors[new Random().Next(listColors.Count)];
Console.ForegroundColor = ConsoleColor.White;
c.DrawFunction(delegate (float x, float y) {
y*= (float)Console.WindowHeight / 2.5F;
y+= (Console.WindowHeight / 2) + 1;
x = x+xOffset;
if (x >= Console.WindowWidth)
x -= Console.WindowWidth;
Console.SetCursorPosition((int) x, (int) y);
Console.Write("-");
},
delegate (float x) {
x = x / (Console.WindowWidth / (float) (2*Math.PI));
return (float) Math.Sin(x);
});
xOffset++;
Console.BackgroundColor = listColors[new Random().Next(listColors.Count)];
Console.SetCursorPosition((Console.WindowWidth - exitString.Length) / 2, 0);
Console.Write(exitString);
}
}
public delegate float /* y */ FunctionHandler(float x);
public delegate void DrawHandler (float x, float y);
public void Fillbackground(DrawHandler Draw)
{
int x;
int y;
for (y = 0; y <= Console.WindowHeight; y++)
{
for (x = 0; x < Console.WindowWidth; x++)
{
Draw(x, y);
}
}
}
public void DrawFunction(DrawHandler Draw, FunctionHandler Function)
{
for (int x = 0; x < Console.WindowWidth; x++)
{
Draw(x, Function(x));
}
}
}
}
?>
?>