[C#] ConsoleColor en tekst in 1 functie.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 26-08 22:19
Hallo Tweakers,

Omdat ik vaak kleuren gebruik in console applicaties heb ik een functie gemaakt. Echter zegt een klasgenoot dat dit niet de juiste manier is. Geen idee of hij gelijk heeft hoor. Maar is dit op een andere methode te doen (die sneller is ?)

Mijn code >:)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
        public void WriteLineEx(string text)
        {
            string[] splits = Regex.Split(text, @"(~[A-Z][A-Z]~)");
            foreach (string node in splits)
            {
                Regex rgx = new Regex(@"(~[A-Z][A-Z]~)");
                if(rgx.IsMatch(node)){
                    Console.ForegroundColor = GetConsoleColor(node.Substring(1, 1));
                    Console.BackgroundColor = GetConsoleColor(node.Substring(2, 1));
                } else {
                    Console.Write(node);
                }
            }
            Console.Write("\n");
        }

        private ConsoleColor GetConsoleColor(string chr){
            switch(chr){
                case "A": return ConsoleColor.Black;
                case "B": return ConsoleColor.Blue;
                case "C": return ConsoleColor.Cyan;
                case "D": return ConsoleColor.DarkBlue;
                case "E": return ConsoleColor.DarkCyan;
                case "F": return ConsoleColor.DarkGray;
                case "G": return ConsoleColor.DarkGreen;
                case "I": return ConsoleColor.DarkMagenta;
                case "J": return ConsoleColor.DarkRed;
                case "K": return ConsoleColor.DarkYellow;
                case "L": return ConsoleColor.Gray;
                case "M": return ConsoleColor.Green;
                case "N": return ConsoleColor.Magenta;
                case "O": return ConsoleColor.Red;
                case "P": return ConsoleColor.White;
                case "Q": return ConsoleColor.Yellow;
                default: return ConsoleColor.Black;
            }
        }

        WriteLineEx("~LA~SCK-SEND ~PA~Data...");


Voor mijn gevoel werkt dit prima, maar volgens mijn klasgenoot is dit troep. Dus Tweakers? Is dit wat om te gebruiken? Of is dit iets voor een prullenbak?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Dragon707 schreef op donderdag 28 april 2011 @ 21:40:
Voor mijn gevoel werkt dit prima, maar volgens mijn klasgenoot is dit troep.
Want :? Heeft 'ie ook een onderbouwing?
Daarmee heb ik niet gezegd dat dit géén troep is; het is alleen zo makkelijk iets te roepen zonder verdere onderbouwing. En hetzelfde geldt voor jou: waarom ga je op z'n woord af? En wat heb je zelf voor mening hierover?

Ik ben overigens niet al te intiem bekend met console applicaties, maar kan de console niet gewoon overweg met ANSI escape codes :? Laat maar; dat kon idd volgens mij niet.
Dragon707 schreef op donderdag 28 april 2011 @ 21:40:
Dus Tweakers? Is dit wat om te gebruiken? Of is dit iets voor een prullenbak?
Het is hier in ieder geval geen rate-my-code / hot-or-not ;) Ik zou dus graag van jezelf en van je klasgenoot graag wat onderbouwing zien ;)

Ik zou zelf, vanwege leesbaarheid (en dus geen vage syntax als "~PA~") eerder gaan voor iets als:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static void Main(string[] args)
{
    WriteC("Sck send\t");
    WriteC("Data\t", ConsoleColor.Red);
    WriteLineC("OK", ConsoleColor.White, ConsoleColor.Green);

    Console.ReadKey();
}

private static void WriteC(object text, ConsoleColor f = ConsoleColor.Gray, ConsoleColor b = ConsoleColor.Black)
{
    Console.ForegroundColor = f;
    Console.BackgroundColor = b;
    Console.Write(text);
}

private static void WriteLineC(object text, ConsoleColor f = ConsoleColor.White, ConsoleColor b = ConsoleColor.Black)
{
    WriteC(text + Environment.NewLine, f, b);
}


Of zoiets:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
static void Main(string[] args)
{
    new CConsole()
        .WriteC("Sck send\t")
        .WriteC("Data\t", ConsoleColor.Red)
        .WriteLineC("OK", ConsoleColor.White, ConsoleColor.Green);

    Console.ReadKey();
}

class CConsole
{
    public CConsole WriteC(object text, ConsoleColor f = ConsoleColor.Gray, ConsoleColor b = ConsoleColor.Black)
    {
        Console.ForegroundColor = f;
        Console.BackgroundColor = b;
        Console.Write(text);
        return this;
    }

    public CConsole WriteLineC(object text, ConsoleColor f = ConsoleColor.White, ConsoleColor b = ConsoleColor.Black)
    {
        return WriteC(text + Environment.NewLine, f, b);
    }
}

[ Voor 69% gewijzigd door RobIII op 28-04-2011 22:32 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • yade
  • Registratie: Mei 2002
  • Laatst online: 16-07 13:47
Er is een enumeration gedefinieerd ConsoleColor. Deze heeft heel duidelijk de namen van de kleuren, Black, Blue, etc.

Vervolgens ga jij iets maken wat in een string met een letter de kleur veranderd. Prima, maar waarom codeer je dat dan met het alfabet? Dat komt de leesbaarheid van de code niet ten goede.

WriteLineEx("~LA~SCK-SEND ~PA~Data...");

Het is totaal onduidelijk welke kleuren er nu gebruikt worden, zonder steeds naar die method the moeten kijken.

Misschien kan je beter een class maken met een fluent interface.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// pseudo
public class ConsoleOutput
{
    public ConsoleOutput Write(string txt)
    {
        Console.Write(txt);
        return this;
    }
    
    public ConsoleOutput FgColor( ConsoleColor color)
    {
        Console.ForegroundColor = color;
        return this;
    }
}

ConsoleOutput output = new ConsoleOutput();

output.FgColor(ConsoleColor.White).Write("White color ").FgColor(ConsoleColor.Blue).Write("Blue color");

[ Voor 36% gewijzigd door yade op 29-04-2011 09:52 ]