二传手一直自称递归
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二传手一直自称递归相关的知识,希望对你有一定的参考价值。
我练的C#事件和委托。当我运行代码,我获得过程被终止由于StackOverflowException
,因为二传手是递归调用本身由于线路:
CurrentPrice = value; //inside the setter of CurrentPrice
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PriceEvent
{
public class PriceChangingEvent : EventArgs
{
public int Counter = 0;
public int CurrentPrice {
get
{
return CurrentPrice;
}
set
{
// only invoke the Event when the Class PriceChangingEvent has been instantiated
if (Counter > 0) // that is when we are not using the constructor
{
CallPriceChanger(this);
}
CurrentPrice = value;
++Counter;
}
}
public int NewPrice { get; set; }
// 2 args Constructor , constructor invokes setter
public PriceChangingEvent(int currentprice, int newprice)
{
this.CurrentPrice = currentprice; // invokes the setter of CurrentPrice
this.NewPrice = newprice;
}
//1. define a delegate between publisher and subscribers
//source publisher who triggers the event,
public delegate void CurrentPriceChangeEventHandler(object source, PriceChangingEvent PriceEvent);
// 2. define an event
public event CurrentPriceChangeEventHandler PriceChange;
// 3. raise the event, OnDataTrained is the method which calls the delegate
protected virtual void OnCurrentPriceChange(PriceChangingEvent PriceEvent)
{
PriceChange.Invoke(this, PriceEvent);
}
// 3.Function which raises the event, OnPriceChanger is the method which calls the delegate
protected virtual void OnPriceChanger(PriceChangingEvent PriceChangingEvent)
{
// this: the class
PriceChange.Invoke(this, PriceChangingEvent);
}
// Function to call the function OnPriceChanger
public void CallPriceChanger(PriceChangingEvent PriceChangingEvent)
{
OnPriceChanger(PriceChangingEvent);
}
}
class Program
{
static void Main(string[] args)
{
PriceChangingEvent p = new PriceChangingEvent(20, 30);
p.CurrentPrice = 45;
}
//subscribers
public static void Display(PriceChangingEvent p)
{
Console.WriteLine("Current Price has been changed to {0}", p.CurrentPrice);
}
}
}
答案
当你的代码比最小的getter或setter更多,你需要有属性支持字段:
private int _currentPrice;
public int CurrentPrice
{
get
{
return _currentPrice;
}
set
{
if (Counter > 0) // that is when we are not using the constructor
{
CallPriceChanger(this);
}
_currentPrice = value;
++Counter;
}
}
您可以进一步使用支持字段来简化代码,其中的构造现在可以直接设置支持字段,你不再需要Counter
价值可言。
public class PriceChangingEvent : EventArgs
{
public PriceChangingEvent(int currentprice, int newprice)
{
_currentPrice = currentprice;
NewPrice = newprice;
}
private int _currentPrice;
public int CurrentPrice
{
get
{
return _currentPrice;
}
set
{
CallPriceChanger(this);
_currentPrice = value;
}
}
//...
}
以上是关于二传手一直自称递归的主要内容,如果未能解决你的问题,请参考以下文章