メソッドにパラメーター化された場合のC#変数の範囲とオブジェクト

StackOverflow https://stackoverflow.com/questions/624217

  •  05-07-2019
  •  | 
  •  

質問

私は継承、多態性、カプセル化を広範囲に利用していますが、オブジェクトと変数のスコープに関する次の動作を知らないことに気付きました。違いはコードで最もよく示されています:

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で渡す

他のヒント

グーグルで検索したところだと思います。タイプなどは「参照」です型。したがって、値型の場合、メソッドにマーシャリングされると値が複製されますが、参照型にはポインターのようなもの、または明らかに親と同じスコープを共有するメソッドに渡される参照があります。だから私の質問は、何かが値型であるかどうかをどのように見分けることができるか、私はintのような構造体はすべて値型ですが、文字列はオブジェクトSystem.Stringであっても構造体のように振る舞うようです?

scroll top