这个问题是我之前提到的一个问题的扩展,链接documentation。
从那时起,我已将我的应用程序更改为不使用static
全局变量来存储API端点信息。我没有提到的是我还在Dictionary
之外设置了令牌变量。我的代码现在看起来像这样:
public partial class TestControl : UserControl
{
private string _token = null; //this used to be a static variable
protected Dictionary<string, string> _endpoints = new Dictionary<string, string>();
protected void Page_Load(object sender, EventArgs e)
{
//clear the lists of endpoints each time the page is loaded
_endpoints.Clear();
...
var sessionInfo = MethodThatAddsToDictionary(_endpoints, _token);
//logic that sets the global tokens based on return values
...
}
public static Dictionary<string, string> MethodThatAddsToDictionary(Dictionary<string, string> endpoints, string token)
{
var returnedTokens = new Dictionary<string, string>();
token = "returned_token"; //this doesn't set the global _token value
...
endpoints.Add(response.First(), response.Last());
}
}
在MethodThatAddsToDictionary()
我直接从方法设置“全局”变量_token
。但是,现在变量不再是静态的,我不能这样做。
我想这个设置有两个基本问题:
endpoints
中的MethodThatAddsToDictionary()
会更改_endpoints
?我假设因为它是一个非静态变量。_token
的效果不一样? 这些问题似乎是传递价值和传递参考之间的细微差别,但我不确定我在这里缺少什么。现在,我只是将令牌变量保存到返回的Dictionary
,并在方法调用后在Page_Load
中设置变量。
谢谢!
答案 0 :(得分:2)
为什么更改
MethodThatAddsToDictionary()
中的端点会更改_endpoints
?
由于您已将_endpoints
传递给该函数,并且Dictionary
是引用类型,因此endpoints
是对_endpoints
相同字典的引用。
为什么这对_token不起作用?
string
也是引用类型,但您并未更改其引用的值,您将引用设置为指向一个 new 字符串值,它对原始值没有影响。
这些问题似乎是传递价值和传递参考之间的细微差别
排序。 所有参数都按值#34;传递,但对于参考类型(如Dictionary
),值是对宾语。如果您在参数类型之前使用token
关键字,将通过引用传递字符串,可以执行与ref
类似的操作。