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()方法,这会导致难以调试的错误。。。