C#,成员和变量范围

C#,成员和变量范围,c#,C#,与问题有关 在我将MyImport更改为类的一个成员后,为什么不能在main中使用它 名称空间串行端口 { 公共课程 { #区域管理器变量 //属性变量 私有字符串_baudRate=string.Empty; 私有字符串_奇偶校验=string.Empty; 私有字符串_stopBits=string.Empty; 私有字符串_dataBits=string.Empty; 私有字符串_portName=string.Empty; 私有RichTextBox\u显示窗口; //全局管理器变量

与问题有关

在我将MyImport更改为类的一个成员后,为什么不能在main中使用它

名称空间串行端口
{
公共课程
{
#区域管理器变量
//属性变量
私有字符串_baudRate=string.Empty;
私有字符串_奇偶校验=string.Empty;
私有字符串_stopBits=string.Empty;
私有字符串_dataBits=string.Empty;
私有字符串_portName=string.Empty;
私有RichTextBox\u显示窗口;
//全局管理器变量
//私有颜色[]MessageColor={Color.Blue,Color.Green,Color.Black,Color.Orange,Color.Red};
内部列表端口缓冲区=新列表(1024);
私有SerialPort myImport=新SerialPort();
#端区
#区域管理器构造函数
/// 
///Comstructor来设置
///串行端口通信器为空
/// 
公共计划()
{
_波特率=string.Empty;
_奇偶校验=string.Empty;
_stopBits=string.Empty;
_dataBits=string.Empty;
_portName=“COM1”;
_displayWindow=null;
//添加事件处理程序
myImport.DataReceived+=新的SerialDataReceivedEventHandler(comPort\u DataReceived);
}
#端区
静态void Main()
{
程序myProgram=新程序();
//1.查找可用的COM端口
字符串[]nameArray=null;
字符串myComPortName=null;
nameArray=SerialPort.GetPortNames();
如果(nameArray.GetUpperBound(0)>=0)
{
myComPortName=nameArray[0];
}
其他的
{
控制台写入线(“错误”);
返回;
}
//2.创建一个serialport对象
//使用()自动关闭端口对象
myImport.PortName=myImportName;
//默认参数为9600,无奇偶校验,一个停止位,无流量控制
//3.打开端口
尝试
{
myImport.Open();
}
捕获(未经授权的访问例外)
{
MessageBox.Show(例如Message);
}
//添加超时,p161
//读取字节
字节[]byteBuffer=新字节[10];
Int32计数;
Int32接收字节数;
myimport.Read(byteBuffer,0,9);
for(count=0;count=numberOfBytesToRead)
{
for(count=0;count

}因为
Main()
是一种
静态方法。实例字段不能通过
静态方法直接访问。静态方法必须创建对象的实例或获取传递给它的对象实例才能实现这一点。

因为
Main
声明为
static
,但您正在尝试访问
private
实例字段。这是不可能的,它们只能从同一类中的方法访问

错误消息甚至会告诉您。它说:

非静态字段、方法或属性需要对象引用


“对象引用”意味着您需要一个实例。

因为main是静态的,而现在您的变量不是

实例变量和方法与类的特定实例相关联—一个您拥有的
new
'd类

静态变量和方法与类类型关联,而不是与任何特定实例关联

如果我有以下资料:

public class Car {
    public int Speed { get; set; }

    public static main(string[] args) {
        Car a = new Car();
        Car b = new Car();

        // This is fine:
        var aSpeed = a.Speed;

        // This doesn't make sense (and doesn't compile)
        // Are we talking about a's speed?  b's speed?  Some other car's speed?
        var someSpeed = Speed;

    }

}

“静态方法无法访问实例字段。”不正确!如果静态方法有一个实例(例如,传递给它的实例或静态实例),它可以访问字段,无论是私有的还是非私有的。@Jason,好的,但这不是OP的问题所在。不过我会调整我的答案。@Jason我认为你的说法是错误的。如果静态方法已经创建了一个实例,或者向其传递了一个实例,那么访问不是通过静态方法进行的;它是通过对象的实例实现的。我想我们谈论的是同一件事,我们只是用了不同的措辞。:)@Shark:我向你保证这是合法的:
class Foo{private int bar;public static void M(Foo Foo){Console.WriteLine(Foo.bar);}}
Foo.bar
是一个私有实例字段,但是静态方法
M
仍然可以访问它。@Jason。我完全同意。但是它是通过
foo
访问的,而不是通过静态方法直接访问的。1。我是否可以删除Main上的static,或者Main本身是static?2。要访问private,我应该为该字段编写一个属性,对吗?它需要是静态的。你真的应该把所有这些东西分解成一个单独的类。
public class Car {
    public int Speed { get; set; }

    public static main(string[] args) {
        Car a = new Car();
        Car b = new Car();

        // This is fine:
        var aSpeed = a.Speed;

        // This doesn't make sense (and doesn't compile)
        // Are we talking about a's speed?  b's speed?  Some other car's speed?
        var someSpeed = Speed;

    }

}