当外部类更改属性时,不会访问属性设置器

时间:2014-04-15 22:37:56

标签: c# properties

我有一个用于创建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;
}

我的问题是SomeInt类中的Main属性被DoSomething的{​​{1}}方法设置为1,但这不会触发OtherClass课程'属性。我做错了吗?

3 个答案:

答案 0 :(得分:0)

您正在做的是将SomeInt 按值传递给DoSomething方法,该方法获取int的副本并仅更改其本地值。

你可以:

  1. 通过ref:public static void DoSomething(ref int someInt)

  2. 传递Main类并更改DoSomething中的值:

    public static void DoSomething(Mainclass main) {main.SomeInt = 1}

答案 1 :(得分:0)

即使您使用ref关键字通过引用传递字段,也无法执行此操作,因为您的属性具有 setter 方法不是你的字段。你应该改变你的属性的值,以便执行 setter 方法并执行验证。

您可以这样做,传递您的类的当前实例而不是字段,例如:

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

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

答案 2 :(得分:0)

如果你想让它调用setter逻辑,一个选项是做这样的事情:

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

然后这样称呼:

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

这里的概念是,你真正给出的方法不是可以设置的变量,而是可以执行的动作。这是一个重要的区别,因为设置属性实际上是一种动作,它可以具有任意复杂的实现。不过,这种方法在实践中有点尴尬,所以你要仔细考虑一下你在这里真正想做什么,以及是否有更好的方式表达所需的依赖。