我有一个用于创建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
课程'属性。我做错了吗?
答案 0 :(得分:0)
您正在做的是将SomeInt 按值传递给DoSomething方法,该方法获取int的副本并仅更改其本地值。
你可以:
通过ref:public static void DoSomething(ref int someInt)
传递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);
}
这里的概念是,你真正给出的方法不是可以设置的变量,而是可以执行的动作。这是一个重要的区别,因为设置属性实际上是一种动作,它可以具有任意复杂的实现。不过,这种方法在实践中有点尴尬,所以你要仔细考虑一下你在这里真正想做什么,以及是否有更好的方式表达所需的依赖。