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; }