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我以暂时精神错乱为借口。修正。有趣-我想这与我实例化了一个
    字典
    ,而没有对
    字符串
    执行相同的操作有关,这使它们有了根本的不同。这很有道理,谢谢你的解释!嗨,我的问题是;为什么需要全局变量?您是否考虑过会话变量?或者应用变量:嗨,我的问题是;为什么需要全局变量?您是否考虑过会话变量?或应用程序变量: