سؤال

هنا هو الرمز الذي يوضح مشكلتي (الكل في نفس مساحة الاسم):

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.Fubar.BGroup.A = true;
    }

    public Foo Fubar = new Foo();
}

public class Foo
{
    public Foo()
    {
    }

    private BoolGroup bGroup = new BoolGroup();
    public BoolGroup BGroup
    {
        get{ return this.bGroup; }
        set
        { 
            this.bGroup = value;
            this.doSomething();
        }
    }
}

public class BoolGroup
{
    public BoolGroup()
    {
    }

    private bool a;
    public bool A
    {
        get { return this.a; }
        set { this.a = value; }
    }
}

private void doSomething()
{
    ....
}

لن أصل إلى dosomething () وأريد حقا. ما الخطأ الذي افعله؟ ستحصل جميع القيم بشكل صحيح، لكنني لا يبدو لي أن أخرج في ذلك الجزء المحدد من BGROUP.

شكرا

هل كانت مفيدة؟

المحلول

أنت لم تحدد أبدا BGroup على الاطلاق. أقرب الأشياء التي تقوم بها هي Fubar.BGroup.A = true و bGroup = new BoolGroup();.
Fubar.BGroup.A = true يحصل على ال BGroup الممتلكات، وتحدد A الممتلكات في BoolGroup كائن، لا يضع BGroup.
bGroup = new BoolGroup() يحدد مجال الدعم لل BGroup الممتلكات، وهذا هو السبب في ذلك BoolGroup عندما تحصل BGroup, ، لكنه لا يمر عبر المسروق.

إذا كنت ترغب في استخدام STERTER، الخاص بك Foo يجب أن تكون الطبقة مثل هذا:

public class Foo
{
    public Foo()
    {
        // Note uppercase on BGroup to access the property and 
        //   not its backing field.
        BGroup = new BoolGroup(); 
    }

    private BoolGroup bGroup;
    public BoolGroup BGroup
    {
        get{ return this.bGroup; }
        set
        { 
            this.bGroup = value;
            this.doSomething();
        }
    }
}

نصائح أخرى

في التعليمات البرمجية الخاصة بك، لا تحدد أبدا BGroup. أنت تحدد، وهو خاصية من bgroup.

جرب شيئا مثل

this.Fubar.BGroup = new BoolGroup();

لا تتصل بضبط خاصية BGroup باستخدام هذا البيان:

this.Fubar.BGroup.A = true;

يدعو "this.fubar.bgroup" "إرجاع Boolgroup) ومع" .a = صحيح "، فأنت تتصل بضبط خاصية Boolgroup.

this.Fubar.BGroup.A = true;

يقوم بوضع خاصية A OF FUBAR.BGROUP، وهي ليست إعداد FUBAR.BGROUP.

الرمز الخاص بك يبدو جيدا. السبب في أنه لا يؤدي إلى تشغيله لأنك لا تقم بالفعل بتعيين fubar.bgroup في أي مكان. أنت تقوم بإعداد FUBAR.BGROUP.A في منشئ النموذج .... هذا لن يؤدي إلى تشغيل طريقة Dosomething. عليك أن تفعل شيئا مثل:

this.Fubar.BGroup = new BGroup();

أو تفعل ذلك داخليا في منشئ فو الخاص بك:

public Foo()
{
    this.BGroup = new BGroup();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top