C# 摆脱;“静态”;C中的引用#
我最近开始学习C#,但遇到了一个恼人的问题。我希望程序中所有函数都可以使用的每个变量,我必须在每个函数前面加一个“static”。我想知道的是,如果可能的话,如何避免这种情况 还有一个小问题:在函数中创建公共变量 这就是我的程序现在的样子,我希望基本上保持这样,而不必到处添加“静态”:C# 摆脱;“静态”;C中的引用#,c#,.net,oop,static,C#,.net,Oop,Static,我最近开始学习C#,但遇到了一个恼人的问题。我希望程序中所有函数都可以使用的每个变量,我必须在每个函数前面加一个“static”。我想知道的是,如果可能的话,如何避免这种情况 还有一个小问题:在函数中创建公共变量 这就是我的程序现在的样子,我希望基本上保持这样,而不必到处添加“静态”: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; us
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Threading;
using System.Net.Sockets;
namespace NetworkExercise
{
class Client
{
public IPAddress addr;
public int port;
public string name;
public Thread thread;
public TcpClient tcp;
public NetworkStream stream;
public Client(IPAddress addr, int port, string name, NetworkStream stream)
{
}
}
class Program
{
//NETWORK
TcpListener tcpListener;
Thread listenThread;
ASCIIEncoding encoder = new ASCIIEncoding();
//DATA
byte[] buffer = new byte[4096];
string servIp;
int servPort;
//CLIENT MANAGEMENT
int clientNum;
static void Main(string[] args)
{
beginConnect();
}
public void beginConnect()
{
Console.Write("Server IP (leave blank if you're the host): ");
servIp = Console.ReadLine();
Console.Write("Port: ");
servPort = Console.Read();
tcpListener = new TcpListener(IPAddress.Any, servPort);
listenThread = new Thread(new ThreadStart(listenForClients));
listenThread.Start();
}
public void listenForClients()
{
tcpListener.Start();
Console.WriteLine("Listening for clients...");
while (true)
{
Client cl = new Client(null, servPort, null, null);
cl.tcp = tcpListener.AcceptTcpClient();
ThreadStart pts = delegate { handleClientCom(cl); };
cl.thread = new Thread(pts);
cl.thread.Start();
}
}
public void handleClientCom(Client cl)
{
cl.stream = cl.tcp.GetStream();
}
}
}使用全局变量通常被认为是不好的做法,因为它们会增加耦合和损坏可维护性,因此如果您发现自己经常使用它们,您应该重新考虑您的方法。如果您的所有代码都使用相同的几个变量,那么调试它可能会非常困难,因为您必须跟踪系统的全局状态,并且不知道程序的哪个部分正在修改它 此外,出于类似的原因,您几乎不应该在类中使用公共字段。这样做可以使客户机代码直接绑定到类的实现中,这样,如果您更改了类的内部机制,那么客户机代码就会中断。您应该使用的是 不过,要回答您的问题:不,如果您希望一个成员可以全局访问,那么它必须是静态的。否则,它只存在于一个对象上,您需要一个引用才能访问它 你可能想在这里读到的一些关键观点有和。将其写在Main中:
static void Main(string[] args)
{
Program myProgram = new Program();
myProgram.beginConnect();
}
尝试在main函数中创建
程序
类的实例。比如:
Program program = new Program();
然后您可以访问成员函数,如:
program.beginConnect();
您已经了解了一些非常重要的基本知识,“static”关键字是什么意思?我如何正确使用它?你会惊讶于有多少人不能正确回答这个问题 正如Rakesh所提到的,编译器要求您将“beginConnect”方法标记为静态,因为beginConnect是一个实例方法,即您需要对象的实例才能调用该方法。他的例子很有效(与tafa的答案相同),我只想补充一点,创建一个程序实例,将逻辑(方法和属性)放入一个单独的类中,创建该类的实例,然后调用该方法是“感觉”不对的
在您研究和理解“静态”的同时,我强烈建议您也要深入了解静态类型和引用类型之间的区别。请记住基本概念-静态方法不是特定于实例的。-除非创建定义该方法的类的实例(方法必须声明为公共),否则不能直接访问非静态方法