Fut*_*ake 1 c# properties coroutine unity-game-engine
我有一个从网络获取一些数据的自定义类。
当我获得这些数据时,我想将它设置为一个属性的值,但是当我这样做时,统一崩溃了。注释行会在没有此行的情况下生成崩溃,一切正常。请参阅下面的代码:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我将如何解决这个问题,这里到底发生了什么?
如果有任何不清楚的地方,请告诉我,以便我澄清。
您必须为该属性使用支持字段:
string _dbData;
public string DBData
{
get
{
if(_dbData == null)
return null;
else
return _dbData;
}
private set
{
_dbData= value;
}
}
Run Code Online (Sandbox Code Playgroud)
属性只是 getter 和 setter 方法的语法糖。所以你可以像这样重写你的属性:
public string GetDBData()
{
if(_dbData == null)
return null;
else
return _dbData;
}
public void SetDBData(string value)
{
_dbData = value;
}
Run Code Online (Sandbox Code Playgroud)
您实现该属性的方式:
public void SetDBData(string value)
{
// you will never get out of here
SetDBData(value);
}
Run Code Online (Sandbox Code Playgroud)