我广泛使用了继承,多态性和封装,但我才意识到我不知道对象范围与变量的以下行为。差异最好用代码显示:

public class Obj
{
    public string sss {get; set;}

    public Obj()
    {
        sss = "0";
    } 
}     

public partial class testScope : System.Web.UI.Page
 {
    protected void Page_Load(object sender, EventArgs e)
    { 
        Obj a = new Obj(); 
        String sss = "0";            
        Context.Response.Write(sss); // 0

        FlipString(sss);
        FlipString(a.sss);
        Context.Response.Write(sss + a.sss); // 0 0

        FlipObject(a);
        Context.Response.Write(a.sss); // 1
        Context.Response.End();
    }

    public void FlipString(string str)
    { str = "1"; }

    public void FlipObject(Obj str)
    { str.sss = "1"; }
}

所以我认为当变量传递给方法时,更改仅限于方法的范围。但似乎如果一个对象被传递给一个更改为它的方法,那么它的属性将超出该方法。

我可以接受这个,如果规则是这个行为存在于对象而不是变量但在.net中一切都是一个对象,一个字符串(就像示例中的那个是System.String)那么什么是规则,怎么能我预测了传递给方法的参数的范围?

有帮助吗?

解决方案

您永远不会将对象作为参数传递 - 您只传递引用或值类型值。除非使用 ref 关键字,否则参数将按值传递 - 即参数的初始值是参数的计算值,并且调用者看不到参数值的更改

但是,了解参数(对于引用类型)的值仅是引用非常重要。如果您更改引用所引用的对象的内容,则 更改 将被调用者看到。

这是一个值得多于几段的话题 - 我建议你阅读我的有关参数的文章传递.NET 以获取更多信息。

其他提示

我认为我只是想到了谷歌,在.net中的一些东西是“价值”。类型和其他类型是“参考”。类型,因此对于值类型,值在被封送到方法时是重复的,但引用类型具有类似指针或传递给方法的引用,该方法明显与父代共享相同的范围。那么我的问题是如何判断某些东西是否是值类型,我看到像int这样的结构都是值类型但是字符串似乎表现得像结构,即使它们是对象System.String?

一个类(在你的情况下是Obj)是一个参考类型,所以当你调用函数时,你真正在做的是将一个引用(你基本上可以认为这是一个类型安全的指针)传递给这个对象。如果你想阻止对可变对象(即类/引用类型)的更改,那么你需要克隆这个对象,然后再将它传递给适当的函数(或者只是考虑将它作为一个结构,以便按值复制)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top