物业私有集崩溃统一

时间:2018-07-13 08:36:19

标签: c# unity3d properties coroutine

我有一个自定义类,可以从网络上获取一些数据。
当我得到这些数据时,我想将其设置为属性的值,但是当我这样做时,它会崩溃。带注释的行会导致崩溃,而没有该行,一切正常。参见下面的代码:

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

我将如何解决此问题,这到底是怎么回事?

如果不清楚,请告诉我,以便澄清。

3 个答案:

答案 0 :(得分:4)

您必须使用属性的后备字段:

string _dbData;

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

对于getter和setter方法,属性只是语法糖。因此,您可以像这样重写您的媒体资源:

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

public void SetDBData(string value)
{
    _dbData = value;
}

实现属性的方式:

public void SetDBData(string value)
{
    // you will never get out of here
    SetDBData(value);
}

答案 1 :(得分:2)

属性充当变量的访问器。在您的情况下,发生的事情基本上是一个无休止的循环-每当有人尝试获取您的属性的值时,它都会不断返回属性本身。相反,您需要一个后备字段_dbData:

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

现在,您的媒体资源将控制对此字段的访问。

答案 2 :(得分:1)

您的访问器可以真正简化。

这样做:

description

将提供与执行结果完全相同的结果:

photos

因此,您可以这样编写访问器:

get
{
    if(DBData == null)
        return null;
    else
        return DBData;
}