Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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中的引用#_C#_.net_Oop_Static - Fatal编程技术网

C# 摆脱;“静态”;C中的引用#

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

我最近开始学习C#,但遇到了一个恼人的问题。我希望程序中所有函数都可以使用的每个变量,我必须在每个函数前面加一个“static”。我想知道的是,如果可能的话,如何避免这种情况

还有一个小问题:在函数中创建公共变量

这就是我的程序现在的样子,我希望基本上保持这样,而不必到处添加“静态”:

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的答案相同),我只想补充一点,创建一个程序实例,将逻辑(方法和属性)放入一个单独的类中,创建该类的实例,然后调用该方法是“感觉”不对的


在您研究和理解“静态”的同时,我强烈建议您也要深入了解静态类型和引用类型之间的区别。

请记住基本概念-静态方法不是特定于实例的。-除非创建定义该方法的类的实例(方法必须声明为公共),否则不能直接访问非静态方法