2017-09-16 13 views
0

他のクラスからオブジェクト値を変更しようとしています。理想的には、オブジェクトをコンストラクタ/メソッドにパラメータとして渡したいと思います。私がこれまでに読んだところでは、オブジェクトはパラメータとして渡されたときに参照として動作し、パラメータ値はメソッドの本体で使用するためにローカルにコピーされます。ここでは、私がテストした構成はほとんどありません。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 
} 

最後にこれが機能します。 InitializeTableref mainTableをフィードすると、mainTableが正常に埋められます。これの背後にある説明は何ですか?なぜコンストラクタにmainTableと同じ参照がありませんでしたか?パラメータとしてオブジェクトを渡すときにまだrefのキーワードが必要なのは、その参照を渡すことですか?

+0

'InitializeTable()は実際に何をしますか?最初の全体の例では、実際には1つの実際の 'DataTable'しかメモリにインスタンス化されていないので、' mainTable'に変更が反映されると確信しています。 – David

+0

データベースからデータを取得し、それをテーブルに割り当てる簡単なクエリ。うん、私も同じ仮定がありますが、ケース#4だけがメインテーブルを埋めました。 – Suwandy

+0

具体的には「テーブルに割り当てる」という意味ですか?コードが期待したことをしていない場合は、コードを曖昧に記述して機能していると仮定して実際に調べてください。 – David

答えて

0

クレジットはダビデに行く:

次に動作を説明しています。ローカルテーブル 変数を新しいDataTableインスタンス(.SelectArray()によって返された)に再割り当てしています。そのため、 は、mainTable変数と同じインスタンスを参照しなくなり、 はそのインスタンスを変更しなくなりました。

+0

あなたは 'readonly Datatable table;'を意味していました。推奨します。 –

関連する問題