C# 在单独的静态方法中设置非静态变量
这个问题是我之前问的一个问题的扩展,链接 从那时起,我将我的应用程序更改为不使用C# 在单独的静态方法中设置非静态变量,c#,asp.net,C#,Asp.net,这个问题是我之前问的一个问题的扩展,链接 从那时起,我将我的应用程序更改为不使用静态全局变量来存储API端点信息。我没有提到的是,我还在字典之外设置令牌变量。我的代码现在看起来像这样: public partial class TestControl : UserControl { private string _token = null; //this used to be a static variable protected Dictionary<string, s
静态
全局变量来存储API端点信息。我没有提到的是,我还在字典
之外设置令牌变量。我的代码现在看起来像这样:
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());
}
}
public部分类TestControl:UserControl
{
私有字符串_-token=null;//这曾经是一个静态变量
受保护字典_端点=新字典();
受保护的无效页面加载(对象发送方、事件参数e)
{
//每次加载页面时清除端点列表
_端点。清除();
...
var sessionInfo=methodthattaddstodictionary(_端点,_标记);
//基于返回值设置全局令牌的逻辑
...
}
添加到字典的公共静态字典方法(字典端点、字符串标记)
{
var returnedTokens=新字典();
token=“returned\u token”;//这不会设置全局\u token值
...
Add(response.First(),response.Last());
}
}
在addstodictionary()的方法中,我直接从该方法设置“全局”变量\u token
。然而,既然变量不再是静态的,我就不能这样做了
我想我对这种设置有两个基本问题:
为什么在添加到字典()的方法中更改端点
会更改\u端点
?我假设,因为它是一个非静态变量
为什么\u令牌的工作方式不一样李>
这些问题似乎是按值传递和按引用传递之间的细微差别,但我不确定我在这里遗漏了什么。目前,我只是将令牌变量保存到字典中,然后返回该字典,并在方法调用后在Page\u Load
中设置变量
谢谢
为什么在添加到字典()的方法中更改端点会更改\u端点
因为您要将\u端点
传递给函数,并且字典
是引用类型,所以端点
是对与\u端点
相同的字典的引用
为什么这对代币不起作用
string
也是一种引用类型,但您没有更改它所引用的值,而是将引用设置为指向新的字符串值,这对原始值没有影响
这些问题似乎是按值传递和按引用传递之间的细微差别
有点。所有参数都是“按值”传递的,但对于引用类型(如字典
),该值是对对象的引用。如果在参数类型之前使用ref
关键字,则可以对token
执行类似的操作,这将通过引用传递字符串
为什么在添加到字典()的方法中更改端点会更改\u端点
因为您要将\u端点
传递给函数,并且字典
是引用类型,所以端点
是对与\u端点
相同的字典的引用
为什么这对代币不起作用
string
也是一种引用类型,但您没有更改它所引用的值,而是将引用设置为指向新的字符串值,这对原始值没有影响
这些问题似乎是按值传递和按引用传递之间的细微差别
有点。所有参数都是“按值”传递的,但对于引用类型(如字典
),该值是对对象的引用。如果在参数类型之前使用ref
关键字,则可以对token
执行类似的操作,这将通过引用传递字符串 不要认为string
是一种值类型。。但它的行为就像一个(顺便说一句,我并没有否决)字符串是引用类型。它的行为完全类似于引用类型,而不是值类型。作为一个值类型(对于实际上是值类型的事物)并不一定是不变的。值类型和引用类型都可以是不可变的;引用类型和值类型都可以是可变的。@BackDoorNoBaby我以暂时精神错乱为借口。修正。有趣-我想这与我实例化了一个字典
,而没有对字符串
执行相同的操作有关,这使它们有了根本的不同。这很有道理,谢谢你的解释!不要认为string
是一种值类型。。但它的行为就像一个(顺便说一句,我并没有否决)字符串是引用类型。它的行为完全类似于引用类型,而不是值类型。作为一个值类型(对于实际上是值类型的事物)并不一定是不变的。值类型和引用类型都可以是不可变的;引用类型和值类型都可以是可变的。@BackDoorNoBaby我以暂时精神错乱为借口。修正。有趣-我想这与我实例化了一个字典
,而没有对字符串
执行相同的操作有关,这使它们有了根本的不同。这很有道理,谢谢你的解释!嗨,我的问题是;为什么需要全局变量?您是否考虑过会话变量?或者应用变量:嗨,我的问题是;为什么需要全局变量?您是否考虑过会话变量?或应用程序变量: