为什么我不能在“公共部分类Form1:Form”中使用变量

时间:2016-02-04 17:14:15

标签: c# winforms

我想在C#中创建一个简单的TCP服务器,所以我想定义一些变量,但是我无法访问我声明的变量。是否有可能绕过这个?

当前代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;

namespace TCP_Server_gui
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        string serverIp = "127.0.0.1";
        int serverPort = 4200;

        IPAddress localAdd = IPAddress.Parse(serverIp);
        TcpListener listener = new TcpListener(localAdd, serverPort);
    }
}

我收到了这些错误:

Severity  Code  Description
Error   CS0236  A field initializer cannot reference the non-static field, method, or property 'Form1.serverIp'
Error   CS0236  A field initializer cannot reference the non-static field, method, or property 'Form1.localAdd'
Error   CS0236  A field initializer cannot reference the non-static field, method, or property 'Form1.serverPort'

3 个答案:

答案 0 :(得分:3)

将非常量初始值设定项放在构造函数中:

    public Form1()
    {
        InitializeComponent();

        localAdd = IPAddress.Parse(serverIp);
        listener = new TcpListener(localAdd, serverPort);
    }

    string serverIp = "127.0.0.1";
    int serverPort = 4200;

    IPAddress localAdd;
    TcpListener listener;
}

原因是因为无法保证字段初始化程序以任何特定顺序运行,因此无法保证在初始化程序时初始化serverIp用于IPAddress次运行。如果将它们放在构造函数中,则可以控制订单。

答案 1 :(得分:3)

C#是一种严格的面向对象语言(对于OOP:P的某个定义),所以没有C风格的变量。相反,你有字段和本地人。

在您的情况下,您已声明了多个字段。但是,字段(与C风格的变量和C#的本地字符不同)没有定义的执行顺序,因此它们的初始值设定项不能相互引用。相反,您需要将初始化器移动到构造函数:

public Form1()
{
    InitializeComponent();

    localAdd = IPAddress.Parse(serverIp);
    listener = new TcpListener(localAdd, serverPort)
}

string serverIp = "127.0.0.1";
int serverPort = 4;

IPAddress localAdd;
TcpListener listener;

答案 2 :(得分:1)

你必须在表单构造函数中调用你的方法:

localAdd

如果您希望在班级中全局访问listenerpublic partial class Form1 : Form { string serverIp = "127.0.0.1"; int serverPort = 4200; IPAddress localAdd; TcpListener listener; public Form1() { InitializeComponent(); localAdd = IPAddress.Parse(serverIp); listener = new TcpListener(localAdd, serverPort); } } ,那么您必须将它们移到构造函数之外:

transform: scale(x)