C# 无递归的堆栈溢出异常
我遇到堆栈溢出异常问题,但我无法确定引发异常的原因。我使用的类库包含我需要的所有方法和对象,并从控制台应用程序运行它 任何帮助都将不胜感激,因为这是几小时后到期的任务的一部分 这是我的密码: 交通事故通知半径计算器类C# 无递归的堆栈溢出异常,c#,console-application,stack-overflow,class-library,C#,Console Application,Stack Overflow,Class Library,我遇到堆栈溢出异常问题,但我无法确定引发异常的原因。我使用的类库包含我需要的所有方法和对象,并从控制台应用程序运行它 任何帮助都将不胜感激,因为这是几小时后到期的任务的一部分 这是我的密码: 交通事故通知半径计算器类 namespace TrafficIncident { public class TrafficIncidentNotificationRadiusCalculator { public double meters; public double CONFIGURED
namespace TrafficIncident
{
public class TrafficIncidentNotificationRadiusCalculator
{
public double meters;
public double CONFIGURED_NOTIFICATION_RADIUS
{
get { return CONFIGURED_NOTIFICATION_RADIUS; }
set { CONFIGURED_NOTIFICATION_RADIUS = meters; }
}
public List<string> GetNotificationRecipientsList(List<User> users, List<UserLocationUpdate> userLocation, TrafficIncidentReport report)
{
int i = 0;
List<string> userNotificationIds = new List<string>();
while (i < userLocation.Count)
{
UserLocationUpdate userLoc = userLocation.ElementAt(i);
userNotificationIds.Add(userLoc.userNotificationId);
Console.WriteLine(userNotificationIds.ElementAt(i));
i++;
}
return userNotificationIds;
}
}
}
用户类
namespace TrafficIncident
{
public class User
{
public string userFName
{
get { return userFName; }
set { userFName = value; }
}
public string userLName
{
get { return userLName; }
set { userLName = value; }
}
}
}
UserLocationUpdate类
namespace TrafficIncident
{
public class UserLocationUpdate
{
public string userNotificationId
{
get { return userNotificationId; }
set { userNotificationId = value; }
}
public double lastKnownLatitude
{
get { return lastKnownLatitude; }
set { lastKnownLatitude = value; }
}
public double lastKnownLongitude
{
get { return lastKnownLongitude; }
set { lastKnownLongitude = value; }
}
}
}
然后这就是运行类库的控制台应用程序:
namespace ClassLibraryTestApp
{
class Program
{
static void Main(string[] args)
{
List<User> users = new List<User>();
List<UserLocationUpdate> userLocation = new List<UserLocationUpdate>();
User user1 = new User();
user1.userFName = "Scott";
user1.userFName = "Gersbank";
users.Add(user1);
User user2 = new User();
user2.userFName = "John";
user2.userFName = "Smith";
users.Add(user2);
User user3 = new User();
user3.userFName = "James";
user3.userFName = "Moore";
users.Add(user3);
UserLocationUpdate user1Location = new UserLocationUpdate();
user1Location.lastKnownLatitude = 0;
user1Location.lastKnownLongitude = 0;
user1Location.userNotificationId = "user1";
userLocation.Add(user1Location);
UserLocationUpdate user2Location = new UserLocationUpdate();
user1Location.lastKnownLatitude = 1;
user1Location.lastKnownLongitude = 1;
user1Location.userNotificationId = "user2";
userLocation.Add(user2Location);
UserLocationUpdate user3Location = new UserLocationUpdate();
user1Location.lastKnownLatitude = 2;
user1Location.lastKnownLongitude = 2;
user1Location.userNotificationId = "user3";
userLocation.Add(user3Location);
TrafficIncidentReport trafficReport = new TrafficIncidentReport();
trafficReport.latitude = 1;
trafficReport.longitude = 1;
trafficReport.SetIncidentLocation();
TrafficIncidentNotificationRadiusCalculator TINRC = new TrafficIncidentNotificationRadiusCalculator();
TINRC.meters = 20000;
TINRC.GetNotificationRecipientsList(users, userLocation, trafficReport);
}
}
}
命名空间类库TestApp
{
班级计划
{
静态void Main(字符串[]参数)
{
列表用户=新列表();
List userLocation=new List();
用户user1=新用户();
user1.userFName=“Scott”;
user1.userFName=“Gersbank”;
users.Add(user1);
用户user2=新用户();
user2.userFName=“John”;
user2.userFName=“Smith”;
users.Add(user2);
User user3=新用户();
user3.userFName=“James”;
user3.userFName=“摩尔”;
users.Add(user3);
UserLocationUpdate user1Location=新的UserLocationUpdate();
user1Location.lastKnownLatitude=0;
user1Location.lastKnownLongitude=0;
user1Location.userNotificationId=“user1”;
添加(user1Location);
UserLocationUpdate user2Location=新的UserLocationUpdate();
user1Location.lastKnownLatitude=1;
user1Location.lastKnownLongitude=1;
user1Location.userNotificationId=“user2”;
添加(user2Location);
UserLocationUpdate user3Location=新的UserLocationUpdate();
user1Location.lastKnownLatitude=2;
user1Location.lastKnownLongitude=2;
user1Location.userNotificationId=“user3”;
添加(user3Location);
TrafficIncidentReport trafficReport=新TrafficIncidentReport();
trafficReport.latitude=1;
trafficReport.longitude=1;
trafficReport.SetIncidentLocation();
交通事故通知RadiusCalculator TINRC=新交通事故通知RadiusCalculator();
TINRC.meters=20000;
TINRC.GetNotificationRecipientsList(用户、用户位置、流量报告);
}
}
}
这不是创建属性、定义私有字段以及属性本身的正确方法:在您的情况下,它将递归调用set_latitude()
方法并导致堆栈溢出异常
错:
public double latitude
{
get { return latitude; }
set { latitude = value; }
}
对:
private double latitude
public double Latitude
{
get { return latitude; }
set { latitude = value; }
}
或使用:
您的代码以递归赋值开始,第一个递归如下:
public double meters;
public double CONFIGURED_NOTIFICATION_RADIUS
{
get { return CONFIGURED_NOTIFICATION_RADIUS; }
set { CONFIGURED_NOTIFICATION_RADIUS = meters; }
}
怎么了:
无论何时为属性设置某个值,它的setter都会触发,
无论何时访问属性值,setter都将
触发在上述情况下,您正在指定属性
它的setter中的值,该值将重复触发setter和
你有例外吗
如果您的getter和setter都是错误的,您应该使用一个备份变量,或者将它们用作{get;set}
。在userNotificationId
的情况下,应按如下方式定义属性:
private _UserNotificationId
public string UserNotificationId
{
get { return _UserNotificationId; }
set { _UserNotificationId= value; }
}
或者干脆
public string UserNotificationId { get; set; }
(堆栈跟踪的一部分)在这里非常有用。它在哪一部分引发异常?您的所有属性似乎都是递归的。(如果你要提供属性方法主体,它们不应该是指它们自己)@Damien_The_unsiever-你击败了我:-)可能的复制
private _UserNotificationId
public string UserNotificationId
{
get { return _UserNotificationId; }
set { _UserNotificationId= value; }
}
public string UserNotificationId { get; set; }