c# - 在 C# 中删除 "static"引用

标签 c# .net oop static

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

此外,还有一个小问题:在函数内部创建公共(public)变量?

这就是我的程序现在的样子,我想基本上保持它的样子,而不必在任何地方添加“静态”:

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

}

最佳答案

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

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

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

您可能想在这里阅读的一些关键想法是 dependency injectionencapsulation .

关于c# - 在 C# 中删除 "static"引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2506521/

相关文章:

c# - 使用 Windows 函数制作窗口模态

.net - 无法加载文件或程序集 'System.IO.Pipelines'

oop - 怎么可能有一个纯面向对象的语言呢?

c# - 什么是/invokerPRAID?

c# - 在非泛型接口(interface)中声明泛型方法

c# - 将 ASP.NET 应用程序转换为 Silverlight 应用程序

python - 正确的设计可以重用更通用函数的结果

c# - C# 桌面应用程序的 native 编译

c# - Microsoft.SqlServer.Smo 问题

c# - 如何在不使用反射的情况下获取类中指定类型的所有属性