Использование определенных переменных в разных классах (C #) - PullRequest
2 голосов
/ 26 февраля 2011


Я довольно новичок в C #, и я пробовал несколько вещей. У меня есть метка (с именем 'newLabel') в form1.cs. У меня есть класс с именем 'method.cs'. В этом классе у меня есть метод

public static void updateLabel()

что я хочу сделать:

public static void updateLabel() 
{
    newLabel.Text = "New Value";
}

но это не работает, вероятно, потому что метод находится в method.cs, а newLabel - в form1.cs.
У меня была такая же проблема с объявленными переменными. В Methods.cs у меня была переменная

int value;

но я не смог использовать эту переменную в form1.cs. Я исправил это, выполнив

public static int value { get; set; }

Я понятия не имею, что это сделало, но это работает, но я не знаю, как я могу применить этот трюк с лейблом.
Может ли кто-нибудь помочь мне с этим?
Спасибо!

Ответы [ 4 ]

4 голосов
/ 26 февраля 2011

Вы должны прочитать о ООП и инкапсуляции. В основном вы хотите форму получить доступ к закрытым полям в другом объекте (вашем классе) - это ограничено инкапсуляцией, поэтому вы столкнулись с проблемой - вы можете обойти их, добавив эти поля и методы в «публичный» интерфейс, который ваш класс объявляет, выполнив их публичные свойства и методы, т.е. в вашем примере:

public int Value {get;set;}

Иногда используется композиция, т. Е. В вашем примере, поскольку ваш класс напрямую обращается к форме, у вас может быть свойство формы для вашего класса:

public Form ViewForm {get;set;}
3 голосов
/ 26 февраля 2011

Было бы лучше, если бы вы выучили C # из учебных пособий, но ответ на этот конкретный вопрос лежит в том, что называется "scope"

По сути, scope - это видимость переменных, классов, функций и объектов.Переменная с пометкой «private» может быть видна только внутри объекта, который ее создал (если он создан внутри функции, он всегда будет закрытым, а любые переменные, определенные внутри функции, могут использоваться только внутри этой функции).Если он создан внутри класса, его может использовать только этот класс.

Переменные или функции, обозначенные как публичные (это можно сделать только внутри класса), можно увидеть снаружи этого класса.Для этого необходимо вызвать myClass.myVariable для доступа к переменной или myClass.myFunction () для доступа к функции.

Для обозначения видимости объекта вы используете ключевые слова «public» или «private».Примечание. Это относится только к переменным и функциям внутри классов (это также относится и к другим элементам внутри классов, таким как вложенные классы и структуры, но это выходит за рамки этого базового вступления).

, например:

class myClass
{
    private int myInt;
    public void myfunction()
    {
        myInt = 1;
    }
}

Это будет работать, так как myInt может быть виден всему внутри myClass

class myOtherClass
{
    private void myfunction()
    {
        myClass myObject = new myClass();
        myObject.myInt = 2;
    }
}

Это не так, поскольку myInt является приватным для myObject, и только myObject может его изменить.myOtherClass не имеет разрешения и не может его видеть.

class myOtherClassTwo
{
    private void myfunction()
    {
        myClass myObject = new myClass();
        myObject.myFunction();
    }
}

Это, к счастью, сработает.myFunction была установлена ​​как общедоступная в классе myClass, поэтому ее может видеть любой, кто находится за пределами класса.

Теперь ключевое слово static, которое вы используете, имеет совершенно другое значение.Я советую вам не использовать его, пока вы не узнаете об этом, поскольку вы только добавляете дополнительную сложность к своим проблемам.

Я надеюсь, что это прояснилось, хотя я должен убедить вас следовать некоторым реальным учебникампоскольку эти основы должны быть тщательно детализированы, иначе вы будете замечены позже.

1 голос
/ 26 февраля 2011

Поскольку ваш метод updateLabel обращается к метке внутри формы, правильный объектно-ориентированный дизайн будет диктовать, что этот метод также должен быть в форме. Тогда у вас нет проблем с доступом к newLabel.

Технически говоря: newLabel ничего не значит вне объекта формы. У вас может быть несколько копий вашей формы, что будет означать несколько копий вашей newLabel; К какому из них это относится? Конечно, компьютер не будет угадывать там; ожидается, что вы сообщите ему, какую форму вы хотите использовать.

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

public static int value;

тогда это сработало бы.

0 голосов
/ 26 февраля 2011

Из Form1 вызовите метод updateLabel в классе mothods:

methods updateMethod = new methods();
newLabel.Text = updateMethod.updateLabel();

С помощью этого метода в классе методов:

public static string updateLabel(){
return "New Value";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...