Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#参数化为方法时变量与对象的范围_C#_Object_Scope - Fatal编程技术网

C#参数化为方法时变量与对象的范围

C#参数化为方法时变量与对象的范围,c#,object,scope,C#,Object,Scope,我广泛使用了继承、多态和封装,但我刚刚意识到我不知道以下关于对象范围和变量范围的行为。代码可以最好地显示差异: public class Obj { public string sss {get; set;} public Obj() { sss = "0"; } } public partial class testScope : System.Web.UI.Page { protected void Page_Load

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

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),那么规则是什么,我如何预测传递到方法中的参数的范围呢?

我想我只是通过谷歌搜索找到了它,net中的某些类型是“值”类型,而其他类型是“引用”类型,因此对于值类型,在封送到方法中时,值是重复的,但引用类型有一个类似于指针的指针,或传递到方法中的引用,该方法显然与父对象共享同一范围。因此,我的问题是如何判断某个对象是否为值类型,我看到像INT这样的结构都是值类型,但字符串的行为似乎与结构相似,即使它们是System.String对象?

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

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


这是一个值得多读几段的主题-我建议您阅读我的文章以了解更多信息。

类(在您的例子中为Obj)是a,因此当您调用函数时,您真正做的是将引用(您基本上可以将其视为类型安全指针)传递到此对象。如果您想防止对可变对象(即类/引用类型)的更改,那么您需要在将对象传递到适当的函数之前克隆这个对象(或者简单地考虑使其成为一个结构,以使其被值复制)。它们的行为实际上不像结构——它们的行为就像引用类型。唯一让它们看起来有点像结构的东西是它们是不可变的,但你也可以编写自己的不可变引用类型。关键是要区分更改参数值以引用不同的对象和更改参数引用的对象的内容。谢谢jon,我一定会在今天晚些时候接受答案,而不是提前接受max rep:)LOL:我不会担心的,这没什么大不了的。一个更好的答案很可能会出现。+1关于一个讨论太少的话题。