【问题标题】:Does explicit conversion modify the object?显式转换会修改对象吗?
【发布时间】:2013-10-26 19:32:00
【问题描述】:

(string)object 这样的显式转换会修改对象本身吗? 当我在 ASP.NET 中使用 Visual C# 进行编码时,我遇到了一件奇怪的事情:

我输入:

NameValueCollection coll;
coll = Request.ServerVariables;
LoginStatue1.Text += coll.GetValues("REMOTE_USER")[0] + "." + (string)coll["REMOTE_USER"] + "." + coll.GetValues("REMOTE_USER")[0];

结果是

..用户名

这意味着第一个coll.GetValues("REMOTE_USER")[0] 没有得到任何东西,而在(string)coll["REMOTE_USER"] 之后,第二个coll.GetValues("REMOTE_USER")[0] 得到用户名。

那么显式转换会改变对象本身吗?

【问题讨论】:

  • 显式转换运算符通常是不可变的,但在使用可变引用类型时可能会产生潜在的副作用。您的问题没有提供足够的细节来确定发生了什么。
  • 您可以定义返回新对象实例的自定义显式运算符(显式转换)。 public static explicit operator string(object i) { return "Object is: "+ i.ToString(); }
  • 显式强制转换不会影响底层对象,实际上在这种情况下它没有任何影响,因为NameValueCollection 索引器属性的结果已经是string 类型。
  • 将对象转换为字符串应该是不可变的,但我不能确定这个具体的例子,因为我们没有足够的信息来确定到底发生了什么。
  • 如果可能,您需要使用调试器单步执行代码。 coll.GetValues() 正在返回一些东西,这意味着 NameValueCollection 包含您要求的密钥,否则您会从 [0] 索引中得到一个异常。上面的代码就是你正在使用的代码吗?

标签: c# asp.net string server-variables explicit-conversion


【解决方案1】:

为了让事情更清楚,我建议尝试这样的事情:

LoginStatue1.Text =  string.Format("1st=({0}),2nd=({1}),3rd=({2})", 
coll.GetValues("REMOTE_USER")[0],  
(string) coll["REMOTE_USER"], 
coll.GetValues("REMOTE_USER")[0]);

结果是什么?我希望第 1 项和第 3 项是相同的。

例如如果我运行这个自包含的示例:

        NameValueCollection  coll;
        coll = new NameValueCollection();
        coll.Add("REMOTE_USER", "Tom");
        coll.Add("REMOTE_USER", "Dick");
        coll.Add("REMOTE_USER", "Harry");
        LoginStatue1.Text =  string.Format("1st=({0}),2nd=({1}),3rd=({2})", coll.GetValues("REMOTE_USER")[0],  (string) coll["REMOTE_USER"], coll.GetValues("REMOTE_USER")[0]);

我得到:1st=(Tom),2nd=(Tom,Dick,Harry),3rd=(Tom)

【讨论】:

    【解决方案2】:

    是的,当然,显式转换会改变对象。 首先,您将无法将对象转换为字符串,C# 不允许这样做。

    如果您能够转换,则对象的行为将与当前数据类型相似,例如

    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            char j = (char)i;
            j--;
            Console.WriteLine(j);
        }
    }
    

    输出:? 请注意,输出不是 -1,因为行为发生了变化。

    【讨论】:

    • 大多数本机显式转换函数是不可变的,并且会创建一个 new 引用来保存该值,而不是更改该值,因此您的答案的第一行是不正确的。
    • 所以这意味着大多数转换都会为重复创建一个位置然后转换它,然后将其分配给目标变量对吗?
    猜你喜欢
    • 2014-08-03
    • 2017-11-11
    • 2020-11-15
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多