在不重新声明它的情况下访问不同命名空间的类

时间:2015-10-01 18:21:21

标签: c# visual-studio class

我刚刚转到C#,我正在使用Visual Basic编程 我不熟悉静态void,C#内部,oke就到了

我有2个cs的命名空间文件,它是1级和2级

public static void Main(string[] args)
{
    log_lib.Log log = new log_lib.Log(2, 0, true, true);
    SockBase base2 = new SockBase(log);
    ProcessPacket packet = new ProcessPacket("configfile.cfg");
}

public class Echo : WebSocketBehavior
{
    protected override void OnMessage(MessageEventArgs e)
    {
          var name = Context.QueryString["name"];
          var msg = !name.IsNullOrEmpty() ? String.Format("{0}", e.Data, name) : e.Data;
          Send(msg);
          packet.DoTheFunction(msg)  <<< This is error
          Console.WriteLine(msg);
          Class1.smethod_0();
    }
}

在visual basic中,我只是将变量和任何类事物定义为全局变量或公共变量,但为什么c#类数据包在第2类中无法访问? 我已经确保在class2中包含class1了 使用Class1;

问题是,如何从Class2访问Class1中的.packet?

4 个答案:

答案 0 :(得分:2)

C#中的变量是范围。范围由{}创建:

public static void Main(string[] args)
{
    log_lib.Log log = new log_lib.Log(2, 0, true, true);
    SockBase base2 = new SockBase(log);
    ProcessPacket packet = new ProcessPacket("configfile.cfg");
}

有一个名为packet的变量,其范围限定为Main函数。您无法在该范围之外访问它。如果您通过这样做使它成为类属性:

public static ProcessPacket Packet {get; set;} //Expose properties, not fields!
public static void Main(string[] args)
{
    log_lib.Log log = new log_lib.Log(2, 0, true, true);
    SockBase base2 = new SockBase(log);
    Packet = new ProcessPacket("configfile.cfg");
}

然后你有一个名为Packet class 作用域成员,你现在可以这样做:

Class1.Packet

访问它的任何其他地方,或在C#6中:

using static Class1; //Why are you doing this!!!

public void someMethod()
{
    Paket.DoSomething(); //Example call so it made sense
}

请注意,这并不是他们引入的静态用法,我会在这里使用一个(或者真的,static,直到你知道你在做什么,但是我离题了。

另请注意,根据您使用Packet静态成员设置代码的方式,如果您尝试在NullReferenceException设置之前使用Main,则可能会<html> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script> <script src="../scripts/form_controllers.js"></script> </head> <body ng-app="EditDocApp"> <div ng-controller="EventDetector"> <input ng-model="event"> <button ng-click = "SelectEvent()">Click</button> </div> </body> </html>

答案 1 :(得分:2)

为了我的娱乐,告诉我一个人,为什么原来的问题被贬低了?

以下是一些问题,第一个命名空间和可见性。

只要两个类位于同一名称空间中,它们就会相互看到:

namespace MyNameSpace
{
    class FirstClass
    {
    }

    class SecondClass
    {
        public DoSomething()
        {
             FirstClass first = new FirstClass();
        }
    }
}

同样的结果,两个班级都互相看见:

//FirstClass.cs
namespace MyNameSpace
{
    class FirstClass
    {
    }
}

//SecondClass.cs
namespace MyNameSpace
{
    class SecondClass
    {
        public DoSomething()
        {
             FirstClass first = new FirstClass();
        }
    }
}

同样的结果,两个类在不同的命名空间中相互看到:

//FirstClass.cs
namespace FirstNameSpace
{
    class FirstClass
    {
    }
}

//SecondClass.cs
using FirstNameSpace; //this only makes FirstClass visible inside this file
namespace SecondNameSpace
{
    class SecondClass
    {
        public DoSomething()
        {
             FirstClass first = new FirstClass();
        }
    }
}

他们可以看到对方,但他们无法访问彼此的数据!

现在的下一个问题是,您出于某种原因想要从SecondClass或甚至其他地方访问FirstClass中的一些数据。要做到这一点,有多种方法可以完成这样的任务,但首先你必须看到该类的实例:

FirstClass将记住静态字段中的最后一个实例:

namespace MyNameSpace
{
    class FirstClass
    {
        public static FirstClass last_instance;
        public string some_public_data;
        public FirstClass()
        {
            this.some_public_data = "some data";
            last_instance= this;
            //keeps last created instance
        }
    }

    class SecondClass
    {
        public DoSomethingWithFirstClass()
        {
             FirstClass first_class = FirstClass.last_instance;
             Console.WriteLine(first_class.some_public_data);
        }
    }

    class Program
    {
         static void Main()
         {
             new FirstClass();//last_instance will be stored
             SecondClass second_class = new SecondClass();
             second_class.DoSomethingWithFirstClass()
         }
    }
}

现在,SecondClass中的内容可以访问FirstClass的last_instance,但是你可能不需要整个实例访问

namespace MyNameSpace
{
    class FirstClass
    {
        public static string some_public_static_data;
        public FirstClass()
        {
            some_public_static_data = "some static data";
        }
    }

    class SecondClass
    {
        public DoSomethingWithStaticDataOfFirstClass()
        {
             Console.WriteLine(FirstClass.some_public_static_data);
        }
    }

    class Program
    {
         static void Main()
         {
             new FirstClass();//it just updates static data

             SecondClass second_class = new SecondClass();
             second_class.DoSomethingWithStaticDataOfFirstClass()
         }
    }
}

答案 2 :(得分:0)

当您在VB中工作时,范围不是那么容易看到但仍然适用,所以当您有一个脚本事件时,这就是范围,您可以将vars添加到该范围并从添加的任何对象中查看它们到范围。

使用C#,范围有点严格,但不比VB更严格。额外的步骤是确保您要在类中访问的对象是公共的,并且是类成员,而不是方法中的私有成员。

public class class1 {

    public ProcessPacket packet;

    public static void maid (){
        packet = new ProcessPacket();
    }
}

现在数据包作为class1的属性可见。您可能希望添加一个getter,以确保在另一个类中请求之前检查该数据包是否已初始化。

答案 3 :(得分:0)

那么,

ProcessPacket packet = new ProcessPacket("configfile.cfg");

在您的main方法范围内。一旦执行流离开主方法,packet就会被处理掉。在其范围之外引用变量是不可能的。因此,您无法在Class2中访问此内容。如果您确实想要公开它,那么您将需要创建Class1的静态公共属性。然后,您可以通过调用Class2Class1.packet中使用此功能。