2

コントロールを渡す動作の参照の種類に参照を渡すことはできますか?

コントロールをコンストラクターに渡すと、実際にはそのコントロールへの参照が渡され、そのコントロールに別のコントロールを割り当てると、値をコピーするのではなく、実際に参照自体をコピーしていることに気付きました! 通常の変数、または少なくとも ref キーワードではこれを実現できないのはなぜですか?

例えば...

public class Test : Form
{

Test()
{
InitializeComponent();
}
Test_Load(object sender, EventArgs e)
{
new Test2((Control)MyTextBox).ShowDialog();
}

}

public class Test2 : Form
{
Public Control x_
Test2(Control x)
{
x_=x;
InitializeComponent();
}
//use x_ somewhere in code to actually change x
}

私が理解していないのは、これはコントロールでは機能しますが、他の変数では機能しないということです。ここで、x を int ref として渡したとします。ref 自体を x_ に渡す方法はありませんか? コントロールの場合、正確にこれがどのように発生するかについて私を混乱させる ref を使用する必要さえありません...メソッドと親/所有者を介して変数を前後に渡す方法を知っているので、私の質問はこれに非常に固有です特定の準ポインタ。たぶん、私は Control を渡す方法を誤解しています。この場合、int を Control とまったく同じように構造化して、int を Control のような int に割り当てると、元の Control を変更するのと同じように元の int を変更します。 .

これは機能します。送信は送信するのと同じです。

    new InputBox(((Label)sender)).ShowDialog();

    Label Send;
    public InputBox(Label send)
    {
     Send=send; 
    }

私はこれが同じように機能することを望みます。Send は send と同じになりましたが、まったく同じではありません。

    new InputBox(((string)sender)).ShowDialog();

    string Send;
    public InputBox(string send)
    {
     Send=send; 
    }

クラス間で変数を渡す方法などは知っていますが、渡されたときに Label が動作するのと同じように文字列を動作させるように具体的に求めています。渡されると、変数をその変数の同じインスタンスと等しくすることができるという意味で、ポインターとまったく同じように渡されます。その文字列の同じインスタンスと等しい文字列を作成できないのはなぜですか?

4

2 に答える 2

4

理解する必要があるのは、値型と参照型の違いだと思います

値のタイプ

独自のメモリ割り当て内にデータを保持する場合、データ型は値型です。

それらには次のタイプが含まれます

  • すべての数値データ型
  • ブール値、文字、および日付
  • メンバーが参照型であっても、すべての構造体
  • 基になる型が常に SByte、Short、Integer、Long、Byte、UShort、UInteger、または ULong であるため、列挙型

一方

参照型

参照型には、データを保持する別のメモリ位置へのポインターが含まれています。

それらには次のタイプが含まれます

  • 要素が値型であっても、すべての配列
  • Form などのクラスの種類
  • デリゲート

refからさらに(C# リファレンス)

ref キーワードにより、引数は値ではなく参照によって渡されます。参照渡しの効果は、メソッド内のパラメーターへの変更が、呼び出し元のメソッドの基になる引数変数に反映されることです。

これは、値型への変更をcollungメソッドに伝播させたい場合に、refを使用するようにメソッドシグネチャを変更する必要がある理由を説明しています。

コンストラクター呼び出しに関する例を次に示します。

Control c1 = null;
Class1 cl1 = new Class1(c1); //c1 is still null after this call
Control c2 = null;
Class1 cl2 = new Class1(ref c2); //c2 is NOT null after this call

class Class1
{
    public Class1(Control c)
    {
        c = new Control();
    }

    public Class1(ref Control c)
    {
        c = new Control();
    }
}
于 2013-06-10T05:25:35.147 に答える
2

.NET の文字列の不変性は、あなたを混乱させるものだと思います。

文字列参照型です。
しかし、不変になるように設計されています。

これは、のインスタンスを変更できないことSystem.Stringを意味します。文字列を変更する操作を行うたびに、文字列の新しいインスタンスが作成されます。このサンプルを見てください:

class A
{
    private string someString;

    public A(string someString)
    {
        this.someString = someString;
    }

    public string SomeString
    {
        get { return someString; }
    }

    public void DoSomething()
    {
        someString = someString + "_abc";
    }
}


var sampleString = "Hello, world!";
var a = new A(sampleString);

Console.WriteLine(a.SomeString == sampleString); // prints 'true'

a.DoSomething();

Console.WriteLine(a.SomeString == sampleString); // prints 'false'
Console.WriteLine(sampleString); // prints 'Hello, world!'
Console.WriteLine(a.SomeString); // prints 'Hello, world!_abc'

最初はsampleStringA.someStringは等しいです。

しかし、この行の後: operator が新しいインスタンスを作成し、代入 operator がそのインスタンスを に割り当てたためsomeString = someString + "_abc"、フィールドは文字列の別のインスタンスをA.someString参照しています。+A.someString

System.StringLabelは変更可能であるため、のように動作することはできませんLabel。したがって、Label.Text = "Foobar";ラベルの新しいインスタンスを作成しません。

UPD。変更可能な文字列が必要な場合は、既に FCL に存在します。これはStringBuilderクラスです。

于 2013-06-10T06:11:38.123 に答える