他のクラスからオブジェクト値を変更しようとしています。理想的には、オブジェクトをコンストラクタ/メソッドにパラメータとして渡したいと思います。私がこれまでに読んだところでは、オブジェクトはパラメータとして渡されたときに参照として動作し、パラメータ値はメソッドの本体で使用するためにローカルにコピーされます。ここでは、私がテストした構成はほとんどありません。C#他のクラスからオブジェクト値を変更
ケース#1。私はProcessor
表はmainTable
に同じ参照を保持していると思ったが、Processor
テーブルを充填したMain
実行mainTable
年末までにはまだ空だった
class Processor
{
DataTable table;
public Processor(DataTable table)
{
this.table = table;
}
public void InitializeTable()
{
if (table != null)
{
// Fill data into DataTable.
}
}
}
static void Main(string[] args)
{
DataTable mainTable = new DataTable();
Processor processor = new Processor(mainTable);
processor.InitializeTable();
// mainTable still empty
}
失敗しました。
ケース#2。私はref
署名を使用してみました
public Processor(ref DataTable table)
{
this.table = table;
}
を失敗しましたが、結果は同じ(
mainTable
は空でした)。
ケース#3。私は、コンストラクタを削除し、InitializeTable()
方法にmainTable
を送りました
public void InitializeTable(DataTable table)
{
// Fill data into table
}
失敗し、結果は同じ(mainTable
は空でした)。
ケース#4。作品!
public void InitializeTable(ref DataTable table)
{
// Fill data into table
}
最後にこれが機能します。 InitializeTable
にref mainTable
をフィードすると、mainTable
が正常に埋められます。これの背後にある説明は何ですか?なぜコンストラクタにmainTable
と同じ参照がありませんでしたか?パラメータとしてオブジェクトを渡すときにまだref
のキーワードが必要なのは、その参照を渡すことですか?
'InitializeTable()は実際に何をしますか?最初の全体の例では、実際には1つの実際の 'DataTable'しかメモリにインスタンス化されていないので、' mainTable'に変更が反映されると確信しています。 – David
データベースからデータを取得し、それをテーブルに割り当てる簡単なクエリ。うん、私も同じ仮定がありますが、ケース#4だけがメインテーブルを埋めました。 – Suwandy
具体的には「テーブルに割り当てる」という意味ですか?コードが期待したことをしていない場合は、コードを曖昧に記述して機能していると仮定して実際に調べてください。 – David