关于C#对象范围

关于C#对象范围,c#,object,scope,C#,Object,Scope,因此,我在主窗口中创建了一个类并实例化了一个对象。然后,当我试图在同一窗口中的按钮中使用该对象时,我不知道如何指示该对象的上下文。我知道这是一个非常基本的问题,但我正在学习,还没有弄明白 public MainWindow() { InitializeComponent(); DeltaMotor M2 = new DeltaMotor(); M2.Card.Set8255(); M2.Stop(); } private void Button_Click(

因此,我在主窗口中创建了一个类并实例化了一个对象。然后,当我试图在同一窗口中的按钮中使用该对象时,我不知道如何指示该对象的上下文。我知道这是一个非常基本的问题,但我正在学习,还没有弄明白

public MainWindow()
{
    InitializeComponent();
    DeltaMotor M2 = new DeltaMotor();
    M2.Card.Set8255();  
    M2.Stop();
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    M2.Move(1); // this can't find M2 within the context
}

我知道这是基本的,但非常感谢您的帮助。

正如您所发现的,
M2
对象不在单击处理程序的作用域内,因为它是
主窗口
构造函数中的局部变量

您可以将
M2
作为类的实例变量,并通过以下两种方法访问它:

private DeltaMotor M2;

public MainWindow()
{
    InitializeComponent();
    M2 = new DeltaMotor();
    M2.Card.Set8255();  
    M2.Stop();
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    M2.Move(1);
}

正如您所发现的,
M2
对象不在click处理程序中的作用域中,因为它是
main窗口
构造函数中的局部变量

您可以将
M2
作为类的实例变量,并通过以下两种方法访问它:

private DeltaMotor M2;

public MainWindow()
{
    InitializeComponent();
    M2 = new DeltaMotor();
    M2.Card.Set8255();  
    M2.Stop();
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    M2.Move(1);
}

您可以将
M2
声明为类属性:

private DeltaMotor M2 { get; set; }

public MainWindow()
{
    InitializeComponent();
    M2 = new DeltaMotor();
    M2.Card.Set8255();  
    M2.Stop();
}
然后从您想要的任何方法访问它:

private void Button_Click(object sender, RoutedEventArgs e)
{
    M2.Move(1); 
}

您可以将
M2
声明为类属性:

private DeltaMotor M2 { get; set; }

public MainWindow()
{
    InitializeComponent();
    M2 = new DeltaMotor();
    M2.Card.Set8255();  
    M2.Stop();
}
然后从您想要的任何方法访问它:

private void Button_Click(object sender, RoutedEventArgs e)
{
    M2.Move(1); 
}

您需要在类级别创建
DeltaMotor
的实例成员

private DeltaMotor _m2;

public MainWindow()
{
    InitializeComponent();
    _m2 = new DeltaMotor();
    _m2.Card.Set8255();  
    _m2.Stop();
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    _m2.Move(1);
}

您需要在类级别创建
DeltaMotor
的实例成员

private DeltaMotor _m2;

public MainWindow()
{
    InitializeComponent();
    _m2 = new DeltaMotor();
    _m2.Card.Set8255();  
    _m2.Stop();
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    _m2.Move(1);
}

如果您只想在这个类中访问它,那么

private DeltaMotor M2;
public MainWindow()
{
    InitializeComponent();
    M2 = new DeltaMotor();
    M2.Card.Set8255();  
    M2.Stop();
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    M2.Move(1); // this can't find M2 within the context
}
会很好用的。为了进一步学习,这里有一个关于变量和方法范围的Microsoft参考:


如果您想在另一个类中访问M2,这将非常有用。希望这能帮助你开始

如果您只想在这个类中访问它,那么

private DeltaMotor M2;
public MainWindow()
{
    InitializeComponent();
    M2 = new DeltaMotor();
    M2.Card.Set8255();  
    M2.Stop();
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    M2.Move(1); // this can't find M2 within the context
}
会很好用的。为了进一步学习,这里有一个关于变量和方法范围的Microsoft参考:


如果您想在另一个类中访问M2,这将非常有用。希望这能帮助你开始

准确地说,它是主窗口构造函数。准确地说,它是主窗口构造函数。没有“对象范围”这样的东西。你说的是局部变量和类字段的范围,Ed是正确的。进一步澄清:物体有生命周期;这是一个运行时概念。命名事物有范围;范围定义为程序文本的一部分,在该部分中可以不加限定地使用名称。范围是一个编译时概念;这是编译器用来确定名称所指的机制之一。此外,现在是养成使用C#命名约定习惯的好日子。局部变量和字段应为
camelCased
;属性和方法应该是
PascalCased
。因此,如果是本地或字段,则您的
M2
应为
M2
,如果是属性,则应为
M2
。然而,
M2
可能也是一个糟糕的名称选择,因为如果没有上下文,很难阅读它并知道它是什么。这些都是很好的澄清、很好的评论和建议。我不知道命名约定,我将更深入地研究它,并确保我做的每件事都是正确的。谢谢。没有“对象范围”这样的东西。你说的是局部变量和类字段的范围,Ed是正确的。进一步澄清:物体有生命周期;这是一个运行时概念。命名事物有范围;范围定义为程序文本的一部分,在该部分中可以不加限定地使用名称。范围是一个编译时概念;这是编译器用来确定名称所指的机制之一。此外,现在是养成使用C#命名约定习惯的好日子。局部变量和字段应为
camelCased
;属性和方法应该是
PascalCased
。因此,如果是本地或字段,则您的
M2
应为
M2
,如果是属性,则应为
M2
。然而,
M2
可能也是一个糟糕的名称选择,因为如果没有上下文,很难阅读它并知道它是什么。这些都是很好的澄清、很好的评论和建议。我不知道命名约定,我将更深入地研究它,并确保我做的每件事都是正确的。谢谢