我刚刚转到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?
答案 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
的静态公共属性。然后,您可以通过调用Class2
在Class1.packet
中使用此功能。