Wyświetlanie nazwy zmiennej

0

Fragment kodu wyświetla liczbę 6

int zmienna = 6;
MessageBox.Show(zmienna.ToString());

a co zrobić, aby wyświetlić nazwę tej zmiennej w tym przypadku "zmienna"
i szukam rozwiązania inne niż, podanie na sztywno, w ten oto sposób:

int zmienna = 6;
MessageBox.Show("zmienna");
1

Możesz wyjaśnić po co ci takie rozwiązanie? I dlaczego nie możesz napisać nazwy zmiennej na sztywno? Preprocesor C# nie udostępnia możliwości tworzenia makr i nie ma odpowiednika ## z C++. A gdybyś chciał wydobyć nazwę zmiennej za pomocą refleksji to trzeba wiedzieć, że niektóre zmienne lokalne w ogóle mogą się nie zachować w kodzie wynikowym programu. Część z nich optymalizator obliczy już na poziomie kompilacji i na stos wrzuci wynik, część z nich to tylko aliasy.

2

@Author, @Rev - nie wszystko stracone na szczęście ;]

Od C# 3.0 mamy całkiem fajny feature jak expression trees. W ten sposób można w sposób kompletnie type-safe napisać:

string GetName<T>(Expression<Func<T>> exp)
{
    var body = exp.Body;
    if (body.NodeType != ExpressionType.MemberAccess) { throw new ArgumentException(); }
    return (body as MemberExpression).Member.Name;
}

Co ciekawe, ten kod faktycznie działa:

class Program
{
    string GetName<T>(Expression<Func<T>> exp)
    {
        var body = exp.Body;
        if (body.NodeType != ExpressionType.MemberAccess) { throw new ArgumentException(); }
        return (body as MemberExpression).Member.Name;
    }

    static void Main(string[] args)
    {
        var prog = new Program();
        Console.WriteLine(prog.GetName(() => prog));
    }
}

Wypisuje 'prog', bo tak została nazwana zmienna.

0

Problem ze zmienną lokalną pozostaje taki sam. W takim wypadku rozwiązany jest on przez zamianę zmiennej lokalnej na niejawne pole klasy (sic!), którego np. na rzecz obliczeń zoptymalizować do postaci rejestru procesora nie można.

0

No Panowie, operujecie za trudną składnią jak dla mnie...
Myślałem, że jest jakaś prostsza metoda, jak w php:

echo "$zmienna"; // zwraca wartość zmiennej
echo '$zmienna'; // zwraca nazwę zmiennej

1

Odpowiednik echo '$zmienna' to Console.Write("zmienna"). I w jednym i w drugim przypadku musisz faktycznie napisać wyraz "zmienna".

Uściślijmy: chcesz napisać odpowiednik czegoś takiego?

#define PRINT_INT_VARIABLE(var) printf("%s: %d\n", #var, var);
int zmienna = 69;
PRINT_INT_VARIABLE(zmienna);

Wynik: zmienna: 69?

1 użytkowników online, w tym zalogowanych: 0, gości: 1