【问题标题】:Getting rid of "static" references in C#摆脱 C# 中的“静态”引用
【发布时间】:2011-01-31 04:21:05
【问题描述】:

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

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

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

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();
    }

}

}

【问题讨论】:

    标签: c# .net oop static


    【解决方案1】:

    使用全局变量通常被认为是不好的做法,因为它们会增加耦合并损害可维护性,因此如果您发现自己经常使用它们,则应该重新考虑您的方法。如果您的所有代码都使用相同的几个变量,您可能很难调试它,因为您必须跟踪系统的全局状态,并且您不知道程序的哪个部分一直在修改它。

    此外,出于类似的原因,您几乎不应该在类中使用公共字段。这样做可以让客户端代码直接绑定到类的实现中,这样如果您更改类的内部机制,客户端代码就会中断。你应该使用的是properties

    不过,要回答您的问题:不,如果您希望成员可全局访问,则它必须是静态的。否则它只存在于一个对象上,您需要对其进行引用才能访问它。

    您可能想在此处阅读的一些关键想法是dependency injectionencapsulation

    【讨论】:

      【解决方案2】:

      您找到了一些非常重要的基础知识,“static”关键字是什么意思,我该如何正确使用它?你会惊讶于有多少人不能正确回答这个问题。

      正如 Rakesh 所提到的,编译器要求您将“beginConnect”方法标记为静态,因为 beginConnect 是一个实例方法,即您需要一个对象实例才能调用该方法。他的示例有效(与 tafa 的答案相同),我只想补充一点,创建 Program 的实例并不“感觉”正确,将逻辑(方法和属性)放入单独的类中,然后创建该类的实例调用方法。

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

      【讨论】:

        【解决方案3】:

        尝试在主函数中创建Program 类的实例。喜欢:

        Program program = new Program();
        

        然后就可以访问成员函数了,比如:

        program.beginConnect();
        

        【讨论】:

          【解决方案4】:

          把这个写在 Main:

          static void Main(string[] args) { Program myProgram = new Program(); myProgram.beginConnect(); }

          【讨论】:

          • 记住基本概念 - 静态方法不是特定于实例的。 - 你不能直接访问非静态方法,除非你创建定义方法的类的实例(方法必须声明为public)
          猜你喜欢
          • 1970-01-01
          • 2019-03-10
          • 2021-08-10
          • 1970-01-01
          • 2015-05-21
          • 1970-01-01
          • 2013-10-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多