メソッドにパラメーター化された場合の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のように)であるというルールであれば、これを受け入れることができますメソッドに渡すパラメーターの範囲を予測しますか
解決
オブジェクトを引数として渡すことはありません。参照または値型の値のみを渡します。 ref
キーワードを使用しない限り、引数は値で渡されます。つまり、パラメーターの初期値は引数の評価値であり、パラメーターの値への変更は呼び出し元には見えません。
ただし、パラメーターの値(参照型の場合)は単なる参照であることを理解することが非常に重要です。参照が参照するオブジェクトの内容を変更した場合、変更した が 呼び出し元に表示されます。
これは、数段落以上に値するトピックです-パラメーターについての記事を読むことをお勧めします詳細については、.NETで渡す。
他のヒント
グーグルで検索したところだと思います。タイプなどは「参照」です型。したがって、値型の場合、メソッドにマーシャリングされると値が複製されますが、参照型にはポインターのようなもの、または明らかに親と同じスコープを共有するメソッドに渡される参照があります。だから私の質問は、何かが値型であるかどうかをどのように見分けることができるか、私はintのような構造体はすべて値型ですが、文字列はオブジェクトSystem.Stringであっても構造体のように振る舞うようです?
クラス(あなたの場合はObj)は、参照型したがって、関数を呼び出すとき、実際に実行しているのは、このオブジェクトへの参照(基本的にはタイプセーフポインターと考えることができます)を渡すことです。可変オブジェクト(クラス/参照型など)への変更を防ぎたい場合は、適切な関数に渡す前にこのオブジェクトのクローンを作成する必要があります(または単に値によってコピーされるように構造化することを検討してください)。