Как присвоить значение из статического метода C # метке - PullRequest
5 голосов
/ 05 февраля 2010

У меня есть следующая статическая функция в c #

public static string Greet(string name)
    {
        string greeting = "welcome  ";

        // is it possible to pass this value to a label outside this static method?
        string concat = string.Concat(greeting, name);

        //error
        Label1.text = concat;

        //I want to return only the name
        return name;
    }

Как вы можете видеть в комментариях, я хочу сохранить только имя в качестве возвращаемого значения, однако я хочу иметь возможность извлечь значение переменной concat, чтобы присвоить его метке, но когда я попробую компилятор отказывается, это можно сделать? Есть ли работа вокруг?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 05 февраля 2010

Если метод по какой-то причине должен быть статическим, основной подход здесь заключается в том, чтобы передать любое требуемое состояние в метод - т.е. добавить в метод параметр, который является либо меткой, либо (лучше) некоторая типизированная оболочка с настраиваемым свойством, например .Greeting:

public static string Greet(string name, YourType whatever)
{
    string greeting = "welcome  ";

    whatever.Greeting = string.Concat(greeting, name);

    return name;
}

(где YourType может быть вашим элементом управления или интерфейсом, позволяющим повторное использование)

То, что вы не хотите сделать, - это использовать статическое состояние или события - очень легко получить утечки памяти и т. Д. Таким образом.


Например:

public static string Greet(string name, IGreetable whatever)
{
    string greeting = "welcome  ";

    whatever.Greeting = string.Concat(greeting, name);

    return name;
}
public interface IGreetable {
    string Greeting {get;set;}
}
public class MyForm : Form, IGreetable {
    // snip some designer code

    public string Greeting {
        get { return helloLabel.Text;}
        set { helloLabel.Text = value;}
    }

    public void SayHello() {
        Greet("Fred", this);
    }
}
4 голосов
/ 05 февраля 2010

Любой нестатический:

public string Greet(string name)
{
    const string greeting = "welcome  ";
    string concat = string.Concat(greeting, name);
    Label1.Text = concat;
    return name;
}

Или все еще статично, передавая метку как Greet("John", Label1):

public static string Greet(string name, Label label)
{
    const string greeting = "welcome  ";
    string concat = string.Concat(greeting, name);
    label.Text = concat;
    return name;
}

Но не уверен, почему вам нужно возвращать имя в любом случае ... если оно было у вас при вызове функции, оно уже есть в области, к которой вы будете возвращаться. Пример:

var name = "John";
Greet(name);
//can still call name here directly
0 голосов
/ 05 февраля 2010

Может быть, я упускаю суть, но ты не мог просто сделать:

public static string Greet(string name)
{
    return string.Concat("Welcome ", name);
}

Тогда используйте это как:

string name = "John";
label1.Text = Greet(name);

Веб-методы не должны быть статичными.

0 голосов
/ 05 февраля 2010

Проблема в том, что вы пытаетесь создать экземпляр переменной класса из статического метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...