Как делает один доступ управление от статического метода?

Работает ли это:

$msgid = 

Работает ли это:

[110]GET['msgid']; $oldMessage = ""; $deletedFormat = ""; //read the entire string $str=file_get_contents('msghistory.txt'); //replace something in the file string - this is a VERY simple example $str=str_replace("$oldMessage", "$deletedFormat",$str); //write the entire string file_put_contents('msghistory.txt', $str);
6
задан Stephen Kennedy 13 March 2018 в 16:05
поделиться

9 ответов

Статический метод не имеет доступа к таким членам, как txtDisplayMessages, потому что он не является частью этого экземпляра. Я предлагаю вам почитать о концепциях статических методов и прочего, потому что это концепция, не зависящая от языка. Этот метод лучше всего обслуживать, удалив модификатор static, потому что он не обязательно должен быть static - похоже, что его нужно будет вызывать конкретным экземпляром этого объекта.

9
ответ дан 8 December 2019 в 03:54
поделиться

Чтобы продолжить, как вы это делали, ваш « TheIncomingDataClass » должен иметь ссылку на объект MainForm , с которым он должен взаимодействовать . Когда вы создаете экземпляр этого класса (предположительно из метода экземпляра MainForm ), вам нужно будет передать ссылку на этот объект MainForm .

class TheIncomingDataClass{
    MainForm form;

    public TheIncomingDataClass(MainForm form){
        this.form = form;
    }
}

class MainForm : Form{
    MainForm(){
        new TheIncomingDataClass(this);
    }
}

Однако, как предлагается by Bugs , вам, вероятно, будет лучше сделать это событие на TheIncomingDataClass и подписаться на него из MainForm .

class IncomingMessageEventArgs : EventArgs{
    IncomingMessageType message;

    public IncomingMessageType Message{get{return message;}}

    public IncomingMessageEventArgs(IncomingMessageType message){
        this.message = message;
    }
}

class TheIncomingDataClass{
    public event EventHandler<IncomingMessageEventArgs> MessageReceived;

    protected virtual void OnMessageReceived(IncomingMessageEventArgs e){
        if(MessageReceived != null)
            MessageReceived(this, e);
    }

    public void IncomingMessage(IncomingMessageType message){
        OnMessageReceived(new IncomingMessageEventArgs(message));
    }
}

class MainForm : Form{
    MainForm(){
        new TheIncomingDataClass().MessageReceived +=
            (s, e)=>txtDisplayMessages.AppendText(e.Message.ToString());
    }
}
7
ответ дан 8 December 2019 в 03:54
поделиться

Можно передать ссылку на текущую форму следующим образом:

public static void ReceiveMSG(string message, MainForm mainform)
{
     mainform.txtDisplayMessages.AppendText(message); 
}

Хотя, как предполагалось, событие, вероятно, лучший способ сделать это.

4
ответ дан 8 December 2019 в 03:54
поделиться

вызвать событие из класса, на который форма может подписаться.

3
ответ дан 8 December 2019 в 03:54
поделиться

Просто удалите модификатор static, он вам не нужен. О статике читайте здесь .

1
ответ дан 8 December 2019 в 03:54
поделиться

Я думаю, вы можете ошибиться в этом вопросе. Похоже, вы пытаетесь отправить сообщение клиенту из внешнего процесса. Есть способы сделать это, но это будет сложно. Я предлагаю клиенту периодически опрашивать любой процесс, у которого есть данные, возможно, каждые 10 секунд, в зависимости от ваших потребностей. Это будет намного проще, чем переход от сервера к клиенту.

1
ответ дан 8 December 2019 в 03:54
поделиться

Вы можете решить эту проблему, удалив ключевое слово static.

Когда вы видите "static", подумайте: без экземпляра этого типа.

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

Когда вы вызываете статический метод, экземпляра нет - вы вышли за границы объектно-ориентированного программирования и теперь находитесь в контексте структурного или функционального программирования. Если вам нужен экземпляр чего-либо, вам нужно ввести его в качестве параметра.

1
ответ дан 8 December 2019 в 03:54
поделиться

Хорошо, поехали. Статические методы могут обращаться только к статическим членам. Ваш метод ReceiveMSG является статическим. txtDisplayMessages нет, и поэтому вы не можете получить к нему доступ. Почему ваш метод должен быть статическим? Излишне говорить, что если вы удалите ключевое слово static, которое решит вашу проблему.

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

Я думаю, вам следует опубликовать именно такое решение вы ожидаете.

1
ответ дан 8 December 2019 в 03:54
поделиться

Поскольку вы новичок в C #, я постараюсь сделать это как можно проще. У вас должен быть файл Program.cs с единственным методом Main (он был бы сгенерирован Visual Studio). Вам нужно будет сделать так, чтобы он выглядел следующим образом:

class Program
{
    public static readonly MainForm MainForm;

    static void Main()
    {
        Application.EnableVisualStyles();
        MainForm = new MainForm(); // These two lines
        Application.Run(MainForm); // are the important ones.
    }
}

Теперь во входящем сообщении у вас будет способ получить доступ к этой форме.

 public void IncomingMessage(IncomingMessageType message)
 {
      Program.MainForm.RecieveMSG(message);
 }

Этот метод в форме будет тогда экземпляром (не статическим) методом. Например,

 public void RecieveMSG(IncomingMessageType message) // NB: No static
 {
     txtDisplayMessages.Text = message.Text; // Or whatever.
 }

Есть способы сделать это лучше, но как новичок я думаю, что это будет лучший подход.

Разница между статическим и экземпляром (экземпляр - это когда вы не говорите статический) огромна. Чтобы получить доступ к методу, полю или свойству экземпляра (которые в C # все вместе называются членами), вам необходимо иметь содержащий его экземпляр. Итак:

 Person p = new Person(); // You now have an instance.
 p.Name = "Fred"; // You are using an instance property.

Статика противоположна, они одинаковы в любом месте вашего приложения (более технически в пределах одного и того же AppDomain - но если вы новичок, вам не нужно беспокоиться об этом некоторое время). Вам не нужен экземпляр для доступа к ним (свойства виджетов кода «Статические методы могут обращаться только к статическим членам»). Например:

 // Where Planet is a class and People is a static property.
 // Somewhat confusingly the Add method is an instance - best left for the student :).
 Planet.People.Add(new Person("Fred")); 

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

Microsoft опубликовала полную статью о важных концепциях, касающихся этого.

0
ответ дан 8 December 2019 в 03:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: