6

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

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),我可以接受这一点那么规则是什么,我如何预测我传递给方法的参数的范围?

4

3 回答 3

19

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

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

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

于 2009-03-08T20:20:57.447 回答
1

我想我只是在谷歌上找到了它,.net 中的一些东西是“值”类型,而另一些是“引用”类型,所以对于值类型,值在被编组为方法时是重复的,但引用类型有一个类似传递给方法的指针或引用,显然与父级共享相同的范围。那么我的问题是如何判断某物是否是值类型,我看到像 int 这样的结构都是值类型,但字符串似乎表现得像结构,即使它们是对象 System.String?

于 2009-03-08T20:20:40.567 回答
1

一个类(在你的例子中是 Obj)是一个引用类型,所以当你调用这个函数时,你真正在做的是将一个引用(你基本上可以把它看作是一个类型安全的指针)传递给这个对象。如果您想阻止对可变对象(即类/引用类型)的更改,那么您需要在将其传递给适当的函数之前克隆该对象(或简单地考虑使其成为一个结构,以便按值复制它)。

于 2009-03-08T20:23:01.480 回答