- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我无法弄清楚如何构建它。
我有一个 VehicleState
类,其属性包括 passengers
:
public class VehicleState
{
public int _temp_passengers;
public int _passengers;
public int passengers
{
set { _temp_passengers = value; }
get { return _passengers; }
}
public void CommitState()
{
_passengers = _temp_passengers;
}
}
有一个循环每 X 秒触发一次。在模拟中,每辆车都会影响另一辆车。
为了避免在每辆车影响其他车辆时破坏属性,我将它们存储在一个临时字段中,例如_乘客
。临时值在循环结束时提交给常规值。
问题如下:
passengers = passengers - 1;
passengers += 1
变成:
_temp_passengers = _passengers - 1;
编辑:
为了进一步解释这个问题,假设有 10 辆车影响 A 车,乘客增加 1。每位乘客都离开他们的车去登上 A 车。
因此操作 passengers += 1
将被调用 10 次,但操作就像只调用了一次一样!
有没有设计模式可以解决这个问题?
我可以像这样将每个属性包装在一个类中吗?
我可以在 set{}
中添加 +=
和 -=
条件吗?
有什么想法吗?谢谢! :)
最佳答案
只需使用一种延迟执行
public class VehicleState
{
List<Action> actionList = new List<Action>();
public int passengers { get; set; }
public void CommitState()
{
foreach (var action in actionList)
{
action();
}
}
public void Execute(Action action)
{
actionList.Add(action);
}
}
测试
[TestMethod]
public void MyTestMethod()
{
var vs = new VehicleState { passengers = 3 };
vs.Execute(() => vs.passengers += 1);
Assert.AreEqual(3, vs.passengers);
vs.CommitState();
Assert.AreEqual(4, vs.passengers);
}
此解决方案仅提供延迟执行。根据您的情况,这可能有用也可能没用。
var vs1 = new VehicleState { passengers = 3 };
var vs2 = new VehicleState { passengers = 3 };
vs1.Execute(() => vs1.passengers += vs2.passengers);
// vs2.Execute(() => vs2.passengers -= vs1.passengers); // does not work
// remember state before
var beforeVs1passengers = vs1.passengers;
vs2.Execute(() => vs2.passengers -= beforeVs1passengers); // that works
vs1.CommitState(); // order might be important, no common state, no stack
vs2.CommitState();
Assert.AreEqual(6, vs1.passengers);
Assert.AreEqual(0, vs2.passengers);
关于c# - 用临时属性覆盖对象属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17926346/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!