首页 > 解决方案 > 属性私有集合崩溃统一

问题描述

我有一个从网络获取一些数据的自定义类。
当我得到这些数据时,我想将它设置为属性的值,但是当我这样做时,统一崩溃了。注释行会在没有此行的情况下生成崩溃,一切正常。请参阅下面的代码:

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

我将如何解决这个问题,这里到底发生了什么?

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

标签: c#unity3dpropertiescoroutine

解决方案


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

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

推荐阅读