如何在运行代码时不断检查变量的值?
我想进行设置,以便无论它如何发生(减去,添加,设置值),只要“ myVar”等于0,就输出“ Dead”
static int myVar = 100;
public static void Main(){
if(Console.ReadLine().Equals("kill")){
myVar = 0;
}
}
public static void Health(){
while(true){
if(myVar==0){
Console.WriteLine("Dead");
}
}
}
答案 0 :(得分:2)
一旦“ myVar”等于0,无论它是如何发生的(减去,添加,设置值),都会输出“ Dead”
最简单,最干净的方法是使myVar
这样的属性:
private static int _myVar;
static int MyVar {
get => _myVar;
set {
_myVar = value;
if(value == 0) Console.WriteLine("Dead");
}
}
public static void Main(){
if(Console.ReadLine().Equals("kill")){
MyVar = 0;
}
}
通常,当存在事件驱动的解决方案时,轮询更新被认为是非常差的解决方案。在这种情况下,您有一个 setter 属性,该属性在属性值每次更改时执行一次:因此,当属性值更改为零时,下一行代码将立即输出“ Dead”需要等待某个线程轮询更改。
答案 1 :(得分:0)
这可能不是我的工作方式,但是如果没有更多信息,很难设计出简洁的东西。这是一个如何使用Task.Run()不断运行您的运行状况循环,同时还读取控制台行的示例。我还做了一个递归方法,以使程序从控制台读取后不会退出。
static int myVar = 100;
public static void Main()
{
Task.Run(() => Health());
ListenForKill();
}
public static void Health()
{
while (true)
{
if (myVar == 0)
{
Console.WriteLine("Dead");
}
}
}
public static void ListenForKill()
{
if (Console.ReadLine().Equals("kill"))
{
myVar = 0;
}
//this way program won't exit
ListenForKill();
}
答案 2 :(得分:0)
如何在运行代码时不断检查变量的值?
完成此任务的好方法是实施发布/订阅解决方案。只要myvar的值发生变化,您的订户就会收到通知。这比其他解决方案更可取,因为它不需要并行编程,并且您可以隔离要如何处理订户中价值变动的逻辑。
class IntgerValueChangedPublisher
{
public int MyVar {
get => _myVar;
set {
_myVar = value;
Publish();
}
}
private int _myVar = 0;
private ICollection<IntegerValueChangedSubscriber> _subscribers = new LinkedList<IntegerValueChangedSubscriber>();
public void Publish()
{
foreach(var subscriber in _subscribers)
{
subscriber.Receive(_myVar);
}
}
public void Subscribe(IntegerValueChangedSubscriber subscriber)
{
_subscribers.Add(subscriber);
}
}
class IntegerValueChangedSubscriber
{
public void Receive(int value)
{
if (value.Equals(0))
{
Console.WriteLine("Dead");
}
}
}
class Program
{
static void Main(string[] args)
{
IntgerValueChangedPublisher valueChangedPublisher = new IntgerValueChangedPublisher();
IntegerValueChangedSubscriber valueChangedSubscriber = new IntegerValueChangedSubscriber();
valueChangedPublisher.Subscribe(valueChangedSubscriber);
while (!Console.ReadLine().Equals("kill"))
{
// keep looping until "kill" is entered
}
valueChangedPublisher.MyVar = 0;
}
}