0

私はC#(PHPから来ています)に少し慣れていません。リストをループすることによって、そのvarialbeへの参照を渡すことができない、つまり次のコードが無効であることに少しショックを受けました。

foreach (ref string var in arr) {
    var = "new value";
}

少し調べてみたところ、「更新可能な列挙子」を作成するという提案が見つかりましたが、それをどの程度正確に行うべきかわかりません。例に従って、IEnumerator.Currentメソッドとカスタム列挙子(PeopleEnum.Current)の両方にCurrentのセッターを追加しようとしましたが、正直なところ、それは盲目的な推測であり、機能しませんでした。ここに貼り付けるのはかなり長いので、コード全体をpastebinに貼り付けています-カスタム列挙子の試行。このコードでは、次の方法で現在の要素にアクセスしようとしています

badClass baddie = new badClass(ref tmp.Current);

「プロパティまたはインデクサーがoutまたはrefパラメーターとして渡されない可能性があります」という予期されるエラーが発生します

私が最終的に目指しているのは、次のようなものです。オブジェクトのリストを繰り返し処理し、各オブジェクトのボタンを生成し、そのボタンのonclickイベントを追加して、新しいフォームを開き、そのオブジェクトの参照を渡します。 、その内容をその新しい形式で編集できるようにします。私はこれをすべて行いましたが、読み取り専用データではなく、参照としてオブジェクトを渡すと、私は死にます。更新可能な列挙子やアイデアについて読むことができる回答、リンクをいただければ幸いです。

4

3 に答える 3

2

まず第一に-あなたを責めたくはありません-私は言うでしょう:あなたが新しい言語を学ぶなら、新しい言語を学びましょう!また、C#を使用してPHPを開発しようとしないでください。コンピューターの言語がすべて同じだとしたら、それほど多くはありません。;-)

あなたの例があなたがやりたい実際の仕事とどのように関連しているかは正確にはわかりませんが、おそらく最初にイベント、デリゲート、LINQについて学ぶ必要があります。このようなことが役立つかもしれません:

foreach (Obj obj in yourBaseObjects) {
    Obj localObj = obj; // See Dans comment!!!
    Button button = new Button(); // however you create your buttons
    button.Click += {
         // do something with obj
         Console.WriteLine(localObj);
    }
}

はい、それはC#で機能し、各イベントハンドラーは正しいオブジェクトを使用します。ニーズに合わない場合は、詳細を提供する必要があります。

于 2011-07-30T13:42:54.823 に答える
1

foreachループを使用している理由。forループを使用します。私は正確なコード/構文を知りませんが、そのようなものです:

int sizeOfArray=objectArray.size();
for(int i=0;i<sizeOfArray;i++)
{
    obj=objectArray[i];
    // use obj whatever you wany
}
于 2011-07-30T13:30:01.907 に答える
0

オブジェクトへの参照を渡そうとしているのではなく(オブジェクトはすでに参照型です)、配列内のオブジェクトの場所への参照を渡そうとしているようですよね?この後者は、メモリと参照を管理する方法のため、.NETでは直接不可能です。ラッパークラスを使用して、このようなことを実現できます(エラー処理はありませんが、これが基本的な考え方です)。

public sealed class ListReference<T>
{
    private readonly IList<T> _list;
    private readonly int _index;

    public ListReference(IList<T> list, int index)
    {
        _list = list;
        _index = index;
    }

    public T Value
    {
        get { return _list[_index]; }
        set { _list[_index] = value; }
    }
}

これで、これを作成して渡すことができます。配列への複数の参照の受け渡しに伴う複雑さのリスクもすべて伴います。可能であれば、これを回避するように設計を変更することをお勧めしますが、目的を達成することは可能です。

于 2011-07-30T13:42:30.383 に答える