2014-04-15 103 views
0

我有一個用於創建dll的公共類。它有一個變量和一個屬性。突然想到假設它看起來像這樣:當外部類改變屬性時,屬性設置器不能訪問

public class Main 
{ 
    private int _someInt = 0; 
    public int SomeInt 
    { 
     get { return this._someInt; } 
     set 
     { 
      this._someInt = value; 
      if (this._someInt == 1) 
      { 
       _someInt = 0; 
      } 
     } 
    } 
    public int ExecuteMain() 
    { 
     OtherClass.DoSomething(this.SomeInt); 
    } 
} 

我也有另一個類,在OtherClass類單獨的項目,具有靜態DoSomething方法:

public static void DoSomething(int someInt) 
{ 
    someInt = 1; 
} 

我的問題是SomeIntMain類中的屬性被DoSomething方法OtherClass設置爲1,但這不會觸發Main類屬性中的setter。難道我做錯了什麼?

+4

您只是設置參數的值,它與您通過的值之間沒有任何相關性,您可以通過'ref'或通過訪問變量的方式 – Sayse

+0

我試着用「 out「關鍵字,但在這種情況下我不能使用屬性。當SomeInt更改爲1時,我需要捕獲事件。可以通過其他方式完成此任務嗎? –

+0

給了它一個想法...我把int包裝在一個對象中。如果我沒有弄錯,對象是通過引用傳遞的,所以我應該改變它的值。價值的確改變了,但我仍然無法觸發二傳手。 –

回答

0

你在做什麼是按值傳遞 SomeInt 到DoSomething的方法,該方法得到了複製整型,只是改變其本地值。

您可以:

  1. 路過裁判:公共靜態無效DoSomething的(REF INT someInt)

  2. 通爲主類和改變內部DoSomething的價值:

    公共靜態無效DoSomething(Mainclass main) {main.SomeInt = 1}

+0

1.不,我不能。我不能通過ref或out的財產。 2.這是事情,我不想在OtherClass中創建一個Main類的實例,因爲Main類已經引用了OtherClass並使用它的方法。我不想最終得到某種循環引用,當代碼增長時可能會出現問題。 –

0

沒有這樣做的話,即使你使用ref關鍵字是不是要去工作,因爲你的財產有的setter方法不是你field.You應該改變你的財產的價值參考傳遞領域,以執行setter方法並執行驗證。

你能做到這一點,通過你的類的當前實例,而不是領域,例如:

public int ExecuteMain() 
{ 
    OtherClass.DoSomething(this); // just pass current instance using 'this' 
} 

public static void DoSomething(Main obj) 
{ 
    obj.SomeInt = 1; 
} 
0

如果你想擁有它調用設置邏輯,一種選擇是做這樣的事情:

public static void DoSomething(Action<int> setSomeInt) 
{ 
    setSomeInt(1); 
} 

然後調用它像這樣:

public int ExecuteMain() 
{ 
    OtherClass.DoSomething(x => this.SomeInt = x); 
} 

這裏的概念是,你」真的給這個方法不是一個可以設置的變量,而是一個可以執行的動作。這是一個重要的區別,因爲設置一個屬性實際上是一種行爲,可以有一個任意複雜的實現。但是,這種方法在實踐中有點尷尬,因此您需要仔細考慮您在這裏要做什麼以及是否有更好的方式來表達所需的依賴關係。