我有一个有2个私有方法的类。在方法A中,我定义了一个变量,比如varA count sth。在方法B中,需要再次使用varA。
但是,varA就像临时计数器一样,似乎不应该被视为类的属性。
那么如何在私有方法B中访问varA?是否可以在私有方法A?
中将varA定义为publicpublic 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的值。
答案 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();
}
}
您可以通过几种方法在varA
和methodA
之间分享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
是一个便宜的电话,并且不会在运行methodA
和methodB
之间进行更改,那么这是一种安全而简单的方法;但是,考虑到你的问题(以及隐含的调用数据库),我认为这不符合你的需求。
您可以将变量从方法本地提升为私有类成员,这使得它(及其值)可用于所有方法:
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"];
}
}