【问题标题】:How do I access a variable in a constructor from a method in C#如何从 C# 中的方法访问构造函数中的变量
【发布时间】:2019-02-20 14:02:18
【问题描述】:

我想从方法访问在构造函数中声明的变量(数组)。我将如何实现这一目标?在下面的示例中,我想使用变量“a”。

public example(int x)    
{  
    int[] a = new int[x];
}  

public void method()  
{
    for (int i = 0; i < a.Length; ++i)
    {
        // the usage of `a`
    }
}

【问题讨论】:

  • 你可以创建一个字段int[] a
  • 将'a'声明为类变量或静态类变量
  • 你不能。它不是那样工作的。您需要将其移到构造函数之外。
  • 你必须定义一个field 来持有它。你在这里所做的被声明为一个局部变量。一旦函数(在这种情况下是构造函数)完成,该变量就不能再访问了。
  • @OfirWinegarten 严格来说它有点复杂,因为它仍然可以使用一些“黑客”来访问这个变量的数据,比如直接从内存中的指针读取。说这个变量会被垃圾回收器收集就够了,不能从外部范围访问

标签: c# class methods constructor properties


【解决方案1】:

我会为a 创建一个私有字段,例如:

private readonly int[] _a;

public Example(int x)
{
   _a = new int[x];
}


public void method()
{
   for(int i = 0; i < _a.Length; ++i)
   // Rest of your code
}

请注意,如果您想在 _a 构造完成后对其进行修改,则必须删除 readonly

【讨论】:

  • 感谢您的快速回复。我会试试你的方法,我还是个编程新手,所以我得先弄清楚_是什么意思。
  • @Neeblet _ 没有任何意义,只是一种编码风格。一个非常大的开发者社区一直在用_ 前缀命名private 成员。它只是一种习惯。您可以随意命名您的班级成员,以实现您问题中的目标。
  • _ 没有任何意义,它被认为与字母大致相同。在 C# 中,将私有字段命名为以 _ 开头是一种常见约定,以确保它们不会与局部变量的名称发生冲突,但它在语言中没有任何实际意义。
【解决方案2】:

实现的方法是将其声明为该类的属性。在构造函数中,您应该初始化私有属性。所以代码看起来像这样:

    private int[] _a {get; set;}
    public example(int x)
    {
        int[] a = new int[x];
        _a = a;
    }

    public void method()
    {
        for (int i = 0; i < a; ++i)

【讨论】:

    【解决方案3】:

    在您的代码中,变量“a”的范围仅在您在构造函数中声明的构造函数结束之前。如果你想在构造函数之外使用变量'a',你应该在构造函数之外但在类的范围内声明它。

    class example
    {
       private int[] a;
       public example(int x)    
       {  
          a = new int[x];
       }  
    
       public void method()  
       {
          for (int i = 0; i < a.Length; ++i)
          {
             // the usage of `a`
          }
       }
    }
    

    建议将此变量声明为私有成员,这样就不能直接在类外赋值。

    【讨论】:

      猜你喜欢
      • 2020-03-22
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 2011-01-18
      相关资源
      最近更新 更多