2009-03-08 6 views
4

私は継承、ポリモーフィズム、カプセル化を大量に使用していますが、オブジェクトのスコープと変数の次の動作についてはわかりませんでした。だから私は、変数は変更は方法の範囲には限定されているメソッドに渡されたときと考えC#変数のスコープとメソッドにパラメータ化されたときのオブジェクト

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)であるという規則があった場合、これを受け入れることができます。私はメソッドに渡すパラメータの範囲を予測できますか?

答えて

18

あなたは、引数としてオブジェクトを渡すことはありません - あなたは今まで参照または値型の値を渡します。 refキーワードを使用しない限り、引数は値渡しされます。つまり、パラメータの初期値は引数の評価値であり、パラメータの値への変更は呼び出し元には見えません。

ただし、(参照タイプの)パラメータの値がのであることを理解することは非常に重要です。参照が参照するオブジェクトの内容を変更した場合は、変更となります。

これはいくつかの段落以上のトピックです - 詳細は私のarticle about parameter passing in .NETを読むことをお勧めします。

+0

ありがとう、私は最大の担当者のために早くではなく、後でその日に答えを受け入れるようになるでしょう:) – rizzle

+0

LOL:それについては心配しません - 大したことではありません。より良い答えがうまく来るかもしれません。 –

+0

+1の議論があまりにも少ないトピックの言及。 – jro

1

私はちょうどそれを考え出したと思います.netのいくつかのものは "値"型で、他は "参照"型なので、値型の場合、メソッドにマーシャリングされたときに値は複製されますが、型は、親と同じスコープを明らかに共有するメソッドに渡される、ポインタのような、または参照を持ちます。だから私の質問は、何かが値の型であるかどうかを知る方法は、intsのような構造体はすべて値型ですが、StringはオブジェクトのSystem.Stringであっても構造体のように振る舞います。

+1

文字列は依然として参照型ですが、不変です。実際には構造体のように動作しません - それらは参照型のように動作します。構造体のように見えるのは、それらが不変であるということだけですが、独自の不変な参照型も書くことができます。 –

+0

重要なポイントは、異なるオブジェクトを参照するためにパラメータの値を変更することと、そのパラメータによって参照されるオブジェクト*の内容を変更することを区別することです。 –

1

クラス(あなたの場合Obj)はreference typeなので、実際に何をしているのかはこのオブジェクトの参照(基本的には型セーフなポインタと考えることができます)を渡すことです。可変オブジェクト(クラス/参照型)の変更を防ぐには、このオブジェクトを適切な関数に渡す前にこのオブジェクトを複製する必要があります(または、値でコピーされるように構造を作成することを検討してください)。

関連する問題