是否可以在私有方法中定义一个 public 变量?
Is it possible to define a public variable in a private method?
我有一个带有 2 个私有方法的 class。在方法 A 中,我定义了一个变量,比如 varA counting sth。在方法 B 中,需要再次使用 varA。
然而,varA 只是……类似于临时计数器,这似乎不应该被视为class 的属性。
那么如何在私有方法 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
}
}
编辑:
class 的上下文:
其实方法A和方法B可以独立运行。但就在这一次,我 运行 方法 A 然后是方法 B。我必须使用 GetSingleValesFromDB() 在方法 B 中再次获取值,就像我在方法 A 中所做的那样。
但是,即使方法 A 和方法 B 的执行之间存在时间间隔,从 DB 获取的值也不会改变,所以我不想在方法 B 中再次 运行 GetSingleValesFromDB(),这会消耗 DB 和连接资源。相反,我喜欢重用 varA 的值。
如果你在一个方法中声明变量,那么你不能从另一个方法访问它,你可以通过这种方式实现
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
}
}
你不能。
唯一的方法是将它放在 class 本身上,您说您不想这样做。
我不确定这是什么原因?您是否考虑过在 class 上创建一个私有变量,以便只有 class 的成员可以访问它?
如果您不想生成成员,您可以生成包含所需对象的字典。
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"];
}
}
首先,您提供的示例代码将无法编译,因为在方法中声明的变量自动是局部的——也就是说,它始终对该方法私有.因此,添加 public/private 访问修饰符是无效的。我还假设还有一些其他方法 ("methodC
") 调用 methodA
& methodB
(因为它们都是私有的),所以你的起始代码应该看起来像这个:
public class MyClass{
private void methodA(){
int varA;
varA = GetSingleValesFromDB();
.......
}
private void methodB(){
DoSomething(varA);
.......
}
public void methodC(){
methodA();
methodB();
}
}
您有几种方法可以在 methodA
和 methodB
之间共享 varA
的值:
- 取值两次
最简单的选择是在每个方法中重新声明和检索 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
之间改变,这是一个安全和简单的方法;但是,考虑到您的问题(以及对数据库的隐含调用),我认为这不能满足您的需求。
- 共享变量和值
您可以将变量从方法局部变量提升为私有 class 成员,这使其(及其值)可用于所有方法:
public class MyClass{
private int varA;
private void methodA(){
varA = GetSingleValesFromDB();
.......
}
private void methodB(){
DoSomething(varA);
.......
}
public void methodC(){
methodA();
methodB();
}
}
但是,如果这个值很容易从 methodA
/methodB
的一次执行到下一次执行发生变化,使变量成为 class 成员会给出错误的印象 - 暗示 (正如你在你的问题中所建议的那样)它是 class 的 属性 当它实际上是与方法执行相关的状态时。
- 传递状态对象
将共享状态包装在一个小数据对象中并将其传递给两种方法:
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);
}
}
methodA
中提供的 varA
的值将在方法调用之间传递,并在整个方法执行(此处由 methodC
表示)完成时进行整理。
我认为这最接近您要查找的内容,因为它在方法之间保留 varA
的值并清楚地标识您存储的值是什么,以及它 "lives" 在程序执行。如果 MyMethodState
变得太大,您可能希望使用自己的方法将 MyMethodState
扩展为完整的 class,但是对于这些简单的调用,纯数据对象应该可以满足您的需要。
我有一个带有 2 个私有方法的 class。在方法 A 中,我定义了一个变量,比如 varA counting sth。在方法 B 中,需要再次使用 varA。
然而,varA 只是……类似于临时计数器,这似乎不应该被视为class 的属性。
那么如何在私有方法 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
}
}
编辑:
class 的上下文:
其实方法A和方法B可以独立运行。但就在这一次,我 运行 方法 A 然后是方法 B。我必须使用 GetSingleValesFromDB() 在方法 B 中再次获取值,就像我在方法 A 中所做的那样。
但是,即使方法 A 和方法 B 的执行之间存在时间间隔,从 DB 获取的值也不会改变,所以我不想在方法 B 中再次 运行 GetSingleValesFromDB(),这会消耗 DB 和连接资源。相反,我喜欢重用 varA 的值。
如果你在一个方法中声明变量,那么你不能从另一个方法访问它,你可以通过这种方式实现
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
}
}
你不能。
唯一的方法是将它放在 class 本身上,您说您不想这样做。
我不确定这是什么原因?您是否考虑过在 class 上创建一个私有变量,以便只有 class 的成员可以访问它?
如果您不想生成成员,您可以生成包含所需对象的字典。
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"];
}
}
首先,您提供的示例代码将无法编译,因为在方法中声明的变量自动是局部的——也就是说,它始终对该方法私有.因此,添加 public/private 访问修饰符是无效的。我还假设还有一些其他方法 ("methodC
") 调用 methodA
& methodB
(因为它们都是私有的),所以你的起始代码应该看起来像这个:
public class MyClass{
private void methodA(){
int varA;
varA = GetSingleValesFromDB();
.......
}
private void methodB(){
DoSomething(varA);
.......
}
public void methodC(){
methodA();
methodB();
}
}
您有几种方法可以在 methodA
和 methodB
之间共享 varA
的值:
- 取值两次
最简单的选择是在每个方法中重新声明和检索 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
之间改变,这是一个安全和简单的方法;但是,考虑到您的问题(以及对数据库的隐含调用),我认为这不能满足您的需求。
- 共享变量和值
您可以将变量从方法局部变量提升为私有 class 成员,这使其(及其值)可用于所有方法:
public class MyClass{
private int varA;
private void methodA(){
varA = GetSingleValesFromDB();
.......
}
private void methodB(){
DoSomething(varA);
.......
}
public void methodC(){
methodA();
methodB();
}
}
但是,如果这个值很容易从 methodA
/methodB
的一次执行到下一次执行发生变化,使变量成为 class 成员会给出错误的印象 - 暗示 (正如你在你的问题中所建议的那样)它是 class 的 属性 当它实际上是与方法执行相关的状态时。
- 传递状态对象
将共享状态包装在一个小数据对象中并将其传递给两种方法:
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);
}
}
methodA
中提供的 varA
的值将在方法调用之间传递,并在整个方法执行(此处由 methodC
表示)完成时进行整理。
我认为这最接近您要查找的内容,因为它在方法之间保留 varA
的值并清楚地标识您存储的值是什么,以及它 "lives" 在程序执行。如果 MyMethodState
变得太大,您可能希望使用自己的方法将 MyMethodState
扩展为完整的 class,但是对于这些简单的调用,纯数据对象应该可以满足您的需要。