Wpis z mikrobloga

W C# wywołuję po naciśnięciu klawisza funkcję z parametrem, którym jest nazwa buttona z instrukcją zmiany tekstu, który na nim widnieje:

private void A_Click(object sender, RoutedEventArgs e)
{
ChangeText(A.Content); //Próbowałem na WF z A.Text, ale to samo)
}

public void ChangeText(object button)
{
button = "DUPA";
}

Niestety nic się nie dzieje, tekst na buttonie nie zmienia się. Co robię źle, jak to inaczej ugryźć?


#naukaprogramowania
  • 12
@avangarda: W C# String jest traktowany jako typ prosty (mimo, że tak naprawdę to obiekt), przez co wywołując funkcję ChangeText przekazujesz w parametrze wartość, a nie referencję do właściwości A.Content. Żeby to działało, musiałbyś w funkcji ChangeText przekazywać całą kontrolkę (button), która jest obiektem i wtedy wyglądałoby to mniej więcej tak:

private void A_Click(object sender, RoutedEventArgs e)
{
ChangeText(A); //zakładam, że A to jest button
}

public void ChangeText(Button button) //
@dobry_programista: Właśnie mi chodzi o to żeby wywoływać funkcję z nazwą konkretnego buttona - mam ich kilka i po kliknięciu w każdy jeden ma wykonywać się ta funkcja, która zmieni nazwę klikanego buttona (i przy okazji wykona kilka innych operacji). Dlatego próbuję przemycić w parametrze "NazwaButtonu.Content". To ma być uniwersalna funkcja.
W C# String jest traktowany jako typ prosty (mimo, że tak naprawdę to obiekt), przez co wywołując funkcję ChangeText przekazujesz w parametrze wartość, a nie referencję do właściwości A.Content. Żeby to działało, musiałbyś w funkcji ChangeText przekazywać całą kontrolkę (button), która jest obiektem i wtedy wyglądałoby to mniej więcej tak:


@dobry_programista: jak nie masz pojęcia to się nie wypowiadaj
@avangarda: String w .Net jest typem referencyjnym (można to sprawdzić używając
String w .Net jest typem referencyjnym (można to sprawdzić używając typeof(string).IsValueType), ale przede wszystkim stringi w .net są obiektami typu immutable (tj. po stworzeniu nie ma możliwości ich edycji, dlatego też przy składaniu stringów korzysta się z klasy StringBuilder która za każdym razem nie jest tworzona od zera)


@avangarda: jeszcze tytułem uzupełnienia, skoro string jest immutable i jest typem referencyjnym to w momencie jego "modyfikacji" zapisujesz do lokalnego wskaźnika referencję do