bugfix> c# > 投稿

オブジェクトの配列があり、setter関数を使用してそのうちの1つを更新したいと思います。ただし、配列のタイプはセッター関数を持たないクラス。したがって、次の例のように、配列を正しいクラスに型キャストしました。

class Parent {
}
class Child : Parent {
    private int n = 0;
    //function specific to Child
    public void updateN(int number)
    {
        n = number
    }
}
class Main {
    static void main(string[] args)
    {
        Parent[] a = new Parent[];
        a[0] = new Child();
        Child c = (Child)a[0];
        c.updateN(1);
    }
}

さて、下部のコードは配列の子オブジェクトを更新しますか?または、変数に格納されているオブジェクトのみを更新しますか c 。そうでない場合、配列内のオブジェクトを更新するための最良の方法は何ですか?

回答 2 件
  • 簡単な答え:はい、配列内のオブジェクトが更新されます

    詳細:

    クラス変数は、実際にはC#のポインターです。したがって、コード内で配列からのポインタがコピーされ、「updateN」が呼び出されます。実際のオブジェクトはコピーされなかったため、メソッドは配列内の同じオブジェクトで呼び出されます。

  • コードにエラーがありましたが、私はあなたが何をしたいのか理解していると思います。以下にソリューションコードを提供しました。確認して試してみて、うまくいくかどうか教えてください。

    class Parent
    {
    }
    class Child : Parent
    {
        private int n = 0;
        //function specific to Child
        public void updateN(int number)
        {
            n = number;
        }
    }
    class ChildofChild : Parent
    {
        private int n = 0;
        //function specific to Child
    }
    class Main
    {
        static void main(string[] args)
        {
            Parent[] a = new Parent[10];
            a[0] = new Child();
            a[1] = new ChildofChild();
            if (a[0] is Child) //a[0] is a Child so it will enter in this "if" segment.
            {
                Child c = (Child)a[0];
                c.updateN(10);
            }
            if (a[1] is Child) //a[1] is Not a Child so it will not enter in this "if" segment.
            {
                Child c = (Child)a[1];
                c.updateN(10);
            }
        }
    }
    
    

    Mainメソッド内で、Parent配列用に2つの異なるタイプのオブジェクトを作成しました。コードを少し安全にするために、「if(a [1] is Child)」条件を使用しました。私の見解では、どのクラスに「updateN」メソッドが含まれているかがわかっている場合は、そのクラスをその「if」条件セグメントに追加し、適切なキャストを使用して目的の値を更新できます。

あなたの答え