是否可以在私有方法中定义公共变量?

时间:2016-05-04 10:07:03

标签: c# private public access-modifiers

我有一个有2个私有方法的类。在方法A中,我定义了一个变量,比如varA count sth。在方法B中,需要再次使用varA。

但是,varA就像临时计数器一样,似乎不应该被视为类的属性。

那么如何在私有方法B中访问varA?是否可以在私有方法A?

中将varA定义为public
public class MyClass{

  private void methodA(){
     private int varA;
     varA = GetSingleValesFromDB();
     .......
  }
  private void methodB(){
    //here, I need to access varA again
    //but I don't want to define varA as attribute of MyClass
  }

}

修改
班级背景:
实际上,方法A和方法B可以独立运行。但是这次我运行方法A然后运行方法B.我必须使用GetSingleValesFromDB()在方法B中再次获取值,就像我在方法A中所做的那样。
但是,即使在方法A和方法B的执行之间存在时间差,从DB获得的值也不会改变,因此我不希望在方法B中再次运行GetSingleValesFromDB(),这会消耗DB和连接资源。相反,我喜欢重复使用varA的值。

4 个答案:

答案 0 :(得分:2)

首先,您提供的示例代码将无法编译,因为在方法中声明的变量是自动本地的 - 也就是说,它总是该方法的私有。因此,添加公共/私有访问修饰符无效。我还假设有一些其他方法(“methodC”)调用methodA& methodB(因为它们都是私有的),所以您的起始代码应如下所示:

public class MyClass{

  private void methodA(){
    int varA;
    varA = GetSingleValesFromDB();
    .......
  }

  private void methodB(){
    DoSomething(varA);
    .......
  }

  public void methodC(){
    methodA();
    methodB();
  }
}

您可以通过几种方法在varAmethodA之间分享methodB的价值:

  • 两次检索值

最简单的选择是在每个方法中重新声明并检索varA,因此您有两个不同的局部变量,因此:

public class MyClass{

  private void methodA(){
    int varA;
    varA = GetSingleValesFromDB();
    .......
  }

  private void methodB(){
    int varA;
    varA = GetSingleValesFromDB();
    DoSomething(varA);
    .......
  }

  public void methodC(){
    methodA();
    methodB();
  }
}

如果GetSingleValesFromDB是一个便宜的电话,并且不会在运行methodAmethodB之间进行更改,那么这是一种安全而简单的方法;但是,考虑到你的问题(以及隐含的调用数据库),我认为这不符合你的需求。

  • 分享变量以及值

您可以将变量从方法本地提升为私有类成员,这使得它(及其值)可用于所有方法:

public class MyClass{

  private int varA;

  private void methodA(){
     varA = GetSingleValesFromDB();
     .......
  }

  private void methodB(){
    DoSomething(varA);
    .......
  }

  public void methodC(){
    methodA();
    methodB();
  }
}

但是,如果此值可能会因methodA / methodB的执行而发生变化,那么将变量视为类成员会给出错误的印象 - 暗示(正如您在问题中所建议的那样) )当它实际上是与方法执行有关的状态时,它是类的属性。

  • 传递状态对象

将小型数据对象中的共享状态换行并将其传递给两个方法:

public class MyClass{

  private class MyMethodState
  {
    public int varA;
  }

  private void methodA(MyMethodState state){
    state.varA = GetSingleValesFromDB();
    .......
  }

  private void methodB(MyMethodState state){
    DoSomething(state.varA);
    .......
  }

  public void methodC(){
    var state = new MyMethodState();
    methodA(state);
    methodB(state);
  }
}

varA中提供的methodA的值将在方法调用之间传递,并在整个方法执行(此处由methodC表示)完成时进行整理。 我认为这最接近你正在寻找的东西,因为它在方法和方法之间保持varA的价值。清楚地确定您存储的值是什么,以及它在程序执行中“存在”的时间。如果MyMethodState增长得太大,您可能希望使用自己的方法将 private RelayCommand _buttonCommandNew; public RelayCommand ButtonCommandNew { get { var worker = new TCService(); return _buttonCommandNew ?? (_buttonCommandNew = new RelayCommand(async () => { var progress = new Progress<string>(status => { ProgressText = status; }); await worker.GenerateConfiguration(1, "", "", progress); }, () => !worker.InProgress )); } } 扩展为完整的类,但对于这些简单的调用,普通数据对象应该可以满足您的需要。

答案 1 :(得分:1)

你不能。

唯一的办法是让它成为课堂本身,你说你不想这样做。

我不确定原因是什么?您是否考虑过在类上创建一个私有变量,以便只有该类的成员可以访问它?

答案 2 :(得分:0)

如果你在方法中声明变量然后你无法从另一个方法中访问它,你可以实现这种方式

public class MyClass
    {

        private int MethodA()
        {
            int varA = GetSingleValesFromDB()
            // do other this using varA
            // then return
            return varA;
        }

        private void MethodB()
        {
           int varB = MethodA(); // this case varA will assign to varB
           // then use varB for anything
        }
    }

答案 3 :(得分:0)

如果您不想生成成员,可以生成包含所需对象的字典。

public class MyClass
{
    private IDictionary<string, object> session = new Dictionary<string, object>();

    private void methodA()
    {
        session["varA"] = GetSingleValesFromDB();
    }

    private void methodB()
    {
        var varA = session["varA"];
    }
}