C# 属性私有集崩溃

C# 属性私有集崩溃,c#,unity3d,properties,coroutine,C#,Unity3d,Properties,Coroutine,我有一个自定义类,可以从web获取一些数据。 当我得到这个数据时,我想将它设置为属性的值,但是当我这样做时,unity崩溃了。注释行生成崩溃,没有这行,一切正常。请参见下面的我的代码: using System; using System.Collections; using UnityEngine; using UnityEngine.Networking; public class GetDB { private readonly Main m; private reado

我有一个自定义类,可以从web获取一些数据。
当我得到这个数据时,我想将它设置为属性的值,但是当我这样做时,unity崩溃了。注释行生成崩溃,没有这行,一切正常。请参见下面的我的代码:

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class GetDB
{
    private readonly Main m;
    private readonly string Url;

    public string DBData { 
        get
        {
            if(DBData == null)
                return null;
            else
                return DBData;
        } 
        private set
        {
            DBData = value;
        } 
    }

    public GetDB(Main m, string url)
    {
        this.m = m;
        this.Url = url;
    }

    public void GetServerData(){
        m.StartCoroutine(GetText(Url, (result) =>{
            this.DBData = result; //THIS LINE CRASHES UNITY
            Debug.Log(result);
        }));
    }

    IEnumerator GetText(string url, Action<string> result) {
        UnityWebRequest www = UnityWebRequest.Get(url);
        yield return www.SendWebRequest();

        if(www.isNetworkError || www.isHttpError) {
            Debug.Log(www.error);
        }
        else {
            if (result != null)
                result(www.downloadHandler.text);
        }
    }
}
使用系统;
使用系统集合;
使用UnityEngine;
使用UnityEngine。联网;
公共类GetDB
{
私有只读主m;
私有只读字符串Url;
公共字符串DBData{
收到
{
if(DBData==null)
返回null;
其他的
返回DBData;
} 
专用设备
{
DBData=值;
} 
}
公共GetDB(主m,字符串url)
{
这个,m=m;
this.Url=Url;
}
public void GetServerData(){
m、 Start例程(GetText(Url,(结果)=>{
this.DBData=result;//此行崩溃
Debug.Log(结果);
}));
}
IEnumerator GetText(字符串url、操作结果){
UnityWebRequest www=UnityWebRequest.Get(url);
返回www.SendWebRequest();
如果(www.isNetworkError | | www.isHttpError){
Debug.Log(www.error);
}
否则{
如果(结果!=null)
结果(www.downloadHandler.text);
}
}
}
我该如何着手解决这个问题,这里到底发生了什么


如果有任何不清楚的地方,请告诉我,以便我可以澄清

您必须为属性使用支持字段:

string _dbData;

public string DBData
{
    get
    {
        if(_dbData == null)
            return null;
        else
            return _dbData;
    }
    private set
    {
        _dbData= value;
    }
}
public void SetDBData(string value)
{
    // you will never get out of here
    SetDBData(value);
}
属性只是getter和setter方法的语法糖。因此,您可以重写您的属性,如:

public string GetDBData()
{
    if(_dbData == null)
        return null;
    else
        return _dbData;
}

public void SetDBData(string value)
{
    _dbData = value;
}
您实现属性的方式:

string _dbData;

public string DBData
{
    get
    {
        if(_dbData == null)
            return null;
        else
            return _dbData;
    }
    private set
    {
        _dbData= value;
    }
}
public void SetDBData(string value)
{
    // you will never get out of here
    SetDBData(value);
}

您必须为属性使用支持字段:

string _dbData;

public string DBData
{
    get
    {
        if(_dbData == null)
            return null;
        else
            return _dbData;
    }
    private set
    {
        _dbData= value;
    }
}
public void SetDBData(string value)
{
    // you will never get out of here
    SetDBData(value);
}
属性只是getter和setter方法的语法糖。因此,您可以重写您的属性,如:

public string GetDBData()
{
    if(_dbData == null)
        return null;
    else
        return _dbData;
}

public void SetDBData(string value)
{
    _dbData = value;
}
您实现属性的方式:

string _dbData;

public string DBData
{
    get
    {
        if(_dbData == null)
            return null;
        else
            return _dbData;
    }
    private set
    {
        _dbData= value;
    }
}
public void SetDBData(string value)
{
    // you will never get out of here
    SetDBData(value);
}

属性充当变量的访问器。在你的案例中发生的事情基本上是一个无止境的循环——每当有人试图获取你的财产的价值时,它总是返回财产本身。相反,您需要一个支持字段_dbData:

private string _dbData;
public string DBData 
{ 
    get
    {
        return _dbData;
    } 
    private set
    {
        _dbData = value;
    } 
}

现在,您的属性控制对该字段的访问。

属性充当变量的访问器。在你的案例中发生的事情基本上是一个无止境的循环——每当有人试图获取你的财产的价值时,它总是返回财产本身。相反,您需要一个支持字段_dbData:

private string _dbData;
public string DBData 
{ 
    get
    {
        return _dbData;
    } 
    private set
    {
        _dbData = value;
    } 
}

现在,您的属性控制对该字段的访问。

您的访问器可以真正简化

做:

get
{
    if(DBData == null)
        return null;
    else
        return DBData;
} 
将提供与执行以下操作完全相同的结果:

get
{
    return DBData; //if DBData is null, it will return null
}
因此,您可以这样编写访问器:

public string DBData 
{ 
    get;
    private set;
}

您的访问器可以真正简化

做:

get
{
    if(DBData == null)
        return null;
    else
        return DBData;
} 
将提供与执行以下操作完全相同的结果:

get
{
    return DBData; //if DBData is null, it will return null
}
因此,您可以这样编写访问器:

public string DBData 
{ 
    get;
    private set;
}

DBData=value这是你的问题。你必须使用一个支持字段。我对c比较陌生,一般来说,那么什么是支持字段呢?
DBData=value这是你的问题。你必须使用支持字段。我对c#基本上是新手,那么支持字段到底是什么呢?我建议你在回答中添加一些关于为什么他的代码不起作用的解释,比如他这样做的方式提供了无限递归,然后是堆栈溢出我建议你在回答中添加一些关于为什么他的代码不起作用的解释,就像他所做的那样,它提供了无限递归,然后是堆栈溢出