Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从函数中声明全局变量?_C#_Global Variables - Fatal编程技术网

C# 从函数中声明全局变量?

C# 从函数中声明全局变量?,c#,global-variables,C#,Global Variables,这是我的密码: private void connect() { try { textBox1.Text += "connecting... \r\n"; button1.Enabled = false; DuplexChannelFactory<IfaceClient2Server> cf = new DuplexChan

这是我的密码:

    private void connect()
    {
        try
        {
            textBox1.Text += "connecting... \r\n";
            button1.Enabled = false;

            DuplexChannelFactory<IfaceClient2Server> cf =
                    new DuplexChannelFactory<IfaceClient2Server>(
                        new CallbackImpl(),
                        new NetTcpBinding(),
                        new EndpointAddress("net.tcp://localhost:9080/service"));

            IfaceClient2Server srv = cf.CreateChannel();
            srv.StartConnection(name); /// need to make this one global!
            textBox1.Text += name + "connected!\r\n"; 
        }
        catch
        {
            button1.Enabled = true;
            textBox1.Text += "error connecting!\r\n";
        }
    }


    private void sendMsg()
    {
        srv.Message_Cleint2Server("Hello!");
        /// srv doesn't exist here.
    }
private void connect()
{
尝试
{
textBox1.Text+=“正在连接…\r\n”;
按钮1.启用=错误;
双工信道工厂=
新双工工厂(
新的CallbackImpl(),
新的NetTcpBinding(),
新端点地址(“net。tcp://localhost:9080/service"));
IfaceClient2Server srv=cf.CreateChannel();
srv.StartConnection(名称);///需要使此连接成为全局连接!
textBox1.Text+=name+“已连接!\r\n”;
}
抓住
{
按钮1.启用=真;
textBox1.Text+=“连接错误!\r\n”;
}
}
私有void sendMsg()
{
srv.Message_Cleint2Server(“你好!”);
///这里不存在srv。
}
正如您所看到的,服务器对象(srv)是通过connect()函数从中声明的,但是我当然需要这个对象是全局的,这样我就可以从其他函数(例如sendMsg)访问它

你认为最好的方法是什么


谢谢

您需要将其设置为实例变量

public class Foo
{
  private string instanceVariable;


  public void Set(string s)
  {
    instanceVariable = s;
  }
  public string Get()
  {
    return instanceVariable; //same value as "s" in "Set"
  }
}

注意:如果向外部公开变量,请使用属性。

您需要将其设置为实例变量

public class Foo
{
  private string instanceVariable;


  public void Set(string s)
  {
    instanceVariable = s;
  }
  public string Get()
  {
    return instanceVariable; //same value as "s" in "Set"
  }
}

注意:如果向外部公开变量,请使用属性。

将其声明为成员变量(不需要是全局的…)是否有一些问题使您不想采用这种方法?

将其声明为成员变量(不需要是全局的…)是否有一些问题使您不想采用这种方法?

我倾向于使用私有setter创建延迟加载的属性。在这种情况下,这意味着您必须对创建srv的cf对象执行相同的操作。

我的首选是使用私有setter创建延迟加载的属性。在这种情况下,这意味着您必须对创建srv的cf对象执行相同的操作。

对于这种类型的问题,最好的方法是创建一个包含静态成员的类,以便您可以从中设置和获取值。通过这种方式,您可以从任何可以看到该类的地方访问它,从而使其成为“全局的”。像这样:

public class ApplicationController
{
    public static IfaceClient2Server Server { get; set; }
}

您可以选择实现自定义get和set来防止问题,也可以将对象创建为类的静态构造函数的一部分。

解决此类问题的最佳方法是创建一个包含静态成员的类,以便您可以从中设置和获取值。通过这种方式,您可以从任何可以看到该类的地方访问它,从而使其成为“全局的”。像这样:

public class ApplicationController
{
    public static IfaceClient2Server Server { get; set; }
}

您可以选择实现自定义get和set以防止问题发生,或者将对象创建为类的静态构造函数的一部分。

为什么不将其声明为全局变量?为什么不能声明变量IfaceClient2Server srv,然后从connect方法为其赋值?不确定如何执行-“IfaceClient2Server srv=新的IfaceClient2Server();“gives”无法创建抽象类或接口BlackBox_客户端的实例。IfaceClient2Server“使用变量IfaceClient2Server srv=null;为什么不将其声明为全局变量?为什么不能声明变量IfaceClient2Server srv,然后从connect方法为其赋值?不确定如何执行此操作--IfaceClient2Server srv=新的IfaceClient2Server();“gives”无法创建抽象类或接口BlackBox_客户端的实例。IfaceClient2Server的“使用变量IfaceClient2Server srv=null;注意全局变量。听起来您对OO编程还相当陌生,当您获取可能是类成员的内容并使其全局可访问时,您正在失去OO的一些固有价值。任何其他获取该变量的类都不能保证connect()方法已被调用,这会导致难以调试的错误…请注意全局变量。听起来您对OO编程还相当陌生,当您获取可能是类成员的内容并使其全局可访问时,您正在失去OO的一些固有价值。获取该变量的任何其他类都不能保证已调用connect()方法,这会导致难以调试的错误。。。